python - 根据条件连接列表中的元素

假设我们有列表

L = ['a', '!b', '!c', 'd', 'e', '!f', 'g', 'h']

如果每个元素以 ! 开头,我们希望将其与前一个元素连接起来。

预期输出:

M = ['a!b!c', 'd', 'e!f', 'g', 'h']

这行得通,但是将列表join 成一个字符串,然后将字符串重新拆分成一个列表可能过于复杂:

M = ''.join(('' if l.startswith('!') else '\n') + l for l in L).splitlines()[1:]
# ['a!b!c', 'd', 'e!f', 'g', 'h']

是否有更简单的方法来根据条件('!' in l)连接列表中的元素?

最佳答案

可能您正在寻找单行代码,但这个不太复杂的循环怎么样?

L = ['a', '!b', '!c', 'd', 'e', '!f', 'g', 'h']
M = []
for x in L:
    if x.startswith("!"):
        M[-1] += x
    else:
        M.append(x)
# ['a!b!c', 'd', 'e!f', 'g', 'h']

如果您更喜欢简短而不是可读,您可以使用 pop...

for x in L:
    M.append(M.pop() + x if x.startswith("!") else x)

我更多地考虑了一个“聪明的”单行解决方案,使用 reducegroupbytakewhile 或“join-and” -split” 解决方案,就像您拥有的解决方案一样,但如果它们完全有效,它们只会使事情变得更加复杂。我认为这是其中一种情况,如果您想要一个单行代码,您应该只为它定义一个函数。

https://stackoverflow.com/questions/65766786/

相关文章:

r - 合并数据帧以使用 plyr 绘制多个时间序列

r - 当 R 数据框中的列等于 1 时如何获取行索引?

python-3.x - 如何更新pyarrow表中的数据?

python - 检查列表与列表理解重叠

c - 在 C 中,如何以通用方式设置任意大小的 int 的前八位

Python - 在 if 语句的 for 循环中跳出 if 语句

python - 按值属性对字典进行排序

apache-kafka - 卡夫卡流 : Define multiple Kafka Stream

c - 为什么我的 C 中的 sin 计算代码返回错误的值?

javascript - 基于另一个对象递归更新特定键的嵌套对象值