如何在 python 中使用 zip 和列表理解来展平 2D 列表并添加分隔符?

how to flatten 2D list and add a separator character using zip and list comprehension in python?

我正在尝试在 python 中编写一个语句来转换此输入(例如):

[[3,4],[1],[1,2]]

进入此输出:

 [3,4,-,1,-,1,2]

仅使用 zip 和列表理解

这是我的代码:

a = [[1,2],[1],[3,4]]
result = [j for i in zip(a,'-'*len(a)) for j in i]

print(result)

但我得到的只是:

[[1, 2], '-', [1], '-', [3, 4], '-']

我的输出应该是这样的:

[1, 2, '-', 1, '-', 3, 4]

我错过了什么?

你可以这样做:

a = [[3,4],[1],[1,2]]

result = []
for i,l in enumerate(a):
    result += l + ["-"] * (i!=len(a)-1)

print(result) # [3, 4, '-', 1, '-', 1, 2]

这是一个重用您的部分代码并仅使用 itertools 库来实现您的目标的解决方案:

# import chain
from itertools import chain

a = [[1,2],[1],[3,4]]
result = list(chain.from_iterable(
         [j for i in zip(a,'-'*len(a)) for j in i]))[:-1]
print(result)

你的输出:

[1, 2, '-', 1, '-', 3, 4]

这应该有效:

a = [[1,2],[1],[3,4]]
result = [a for i in zip(a,'-'*len(a)) for j in i for a in j]
print(result)

输出:

[1, 2, '-', 1, '-', 3, 4, '-']

如果您不想包含最后一个 '-',这也适用:

a = [[1,2],[1],[3,4]]
result = [a for i in zip(a, '-'*len(a)) for j in i for a in j][:-1]
print(result)

输出:

[1, 2, '-', 1, '-', 3, 4]

添加另一个 for 子句并在除第一个之外的每个内部列表之前添加分隔符:

[k for i in zip([[]]+['-']*len(a), a) for j in i for k in j]

结果(Try it online!):

[1, 2, '-', 1, '-', 3, 4]

zip(...)给出了这三对:

([], [1, 2])
('-', [1])
('-', [3, 4])

那么j就是里面的lists/strings,而k就是numbers/characters,所以我们可以用k作为列表的结果元素理解。