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

Bas*_*asj 2 python list concatenation

假设我们有列表

L = ['a', '!b', '!c', 'd', 'e', '!f', 'g', 'h']
Run Code Online (Sandbox Code Playgroud)

如果每个元素以!.

预期输出:

M = ['a!b!c', 'd', 'e!f', 'g', 'h']
Run Code Online (Sandbox Code Playgroud)

这有效,但join将列表转换为字符串可能会不必要地复杂,然后将字符串重新拆分为列表:

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

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

tob*_*s_k 5

可能你正在寻找一个单线,但是这个不太复杂的循环怎么样?

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']
Run Code Online (Sandbox Code Playgroud)

如果您更喜欢简短易读,则可以使用三元pop...

for x in L:
    M.append(M.pop() + x if x.startswith("!") else x)
Run Code Online (Sandbox Code Playgroud)

我想详细了解一下与“聪明”单行的解决方案reducegroupbytakewhile,或“加入和分裂”解决方案,如你有一个,但如果他们在所有的工作,他们只是让问题更加复杂。我认为这是一种情况,如果你想要一个单线,你应该只为它定义一个函数。