如何在Python中合并两个生成器的输出
我有两个生成器 g1 和 g2。
for line in g1:
print line[0]
[a, a, a]
[b, b, b]
[c, c, c]
for line1 in g2:
print line1[0]
[1, 1, 1]
[2, 2, 2]
[3, 3, 3]
for line in itertools.chain(g1, g2):
print line[0]
[a, a, a]
[b, b, b]
[c, c, c]
[1, 1, 1]
[2, 2, 2]
[3, 3, 3]
我想要的输出是这样的:
[a, a, a],[1, 1, 1]
[b, b, b],[2, 2, 2]
[c, c, c],[3, 3, 3]
或者
[a, a, a, 1, 1, 1]
[b, b, b, 2, 2, 2]
[c, c, c, 3, 3, 3]
谢谢你的帮助。
4 个回答
3
假设你有两个东西,叫做 g1
和 g2
:
g1 = [
[['a', 'a', 'a'], ['e', 'e'], ['f', 'g']],
[['b', 'b', 'b'], ['e', 'e'], ['f', 'g']],
[['c', 'c', 'c'], ['e', 'e'], ['f', 'g']],
]
g2 = [
[[1, 1, 1], ['t', 'q'], ['h', 't']],
[[2, 2, 2], ['r', 'a'], ['l', 'o']],
[[3, 3, 3], ['x', 'w'], ['z', 'p']],
]
如果你想得到这个结果:
[a, a, a],[1, 1, 1]
[b, b, b],[2, 2, 2]
[c, c, c],[3, 3, 3]
你可以这样做:
result1 = map(lambda a, b: (a[0], b[0]) , g1, g2)
# Which is like this :
[(['a', 'a', 'a'], [1, 1, 1]),
(['b', 'b', 'b'], [2, 2, 2]),
(['c', 'c', 'c'], [3, 3, 3])]
对于第二个结果:
[a, a, a, 1, 1, 1]
[b, b, b, 2, 2, 2]
[c, c, c, 3, 3, 3]
result2 = map(lambda a, b: a[0]+b[0] , g1, g2)
# Which is like that :
[['a', 'a', 'a', 1, 1, 1],
['b', 'b', 'b', 2, 2, 2],
['c', 'c', 'c', 3, 3, 3]]
4
你可以使用 itertools.izip,比如说。
g1=([s]*3 for s in string.ascii_lowercase)
g2=([s]*3 for s in string.ascii_uppercase)
g=itertools.izip(g1,g2)
这样做可以确保结果也是一个生成器。
如果你更喜欢使用第二种方法,这里有个做法。
g1=([s]*3 for s in string.ascii_lowercase)
g2=([s]*3 for s in string.ascii_uppercase)
g=(x+y for x,y in itertools.izip(g1,g2))
18
第一种情况:使用
for x, y in zip(g1, g2):
print(x[0], y[0])
第二种情况:使用
for x, y in zip(g1, g2):
print(x[0] + y[0])
当然,你也可以使用 itertools.izip
来得到生成器版本。如果你在 Python 3 及更高版本中使用 zip
,那么你会自动得到一个生成器。