如何在 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
作为列表的结果元素理解。
我正在尝试在 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
作为列表的结果元素理解。