[英]How to join/merge two generators output using 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]
谢谢您的帮助。
第一种情况:使用
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
,则会自动获得生成器。
例如,您可以使用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))
你可以使用zip(g1, g2)
获得成对的东西(你的第一个请求zip(g1, g2)
。 你可以通过[a + b for a, b in zip(g1, g2)]
加入它们(你的第二个请求)。
几乎等效,你可以使用map
。 使用map(None, g1, g2)
生成对列表,并map(lambda x, y: x + y, g1, g2)
以将这些对连接在一起。
在您的示例中,您的生成器每次都生成一个列表或元组,其中您只对第一个元素感兴趣。 我只是生成你需要的东西,或者在压缩或映射之前预处理它们。 例如:
g1 = (g[0] for g in g1)
g2 = (g[0] for g in g2)
或者,您可以在地图中应用[0]。 这是两种情况:
map(lambda x, y: (x[0], y[0]), g1, g2)
map(lambda x, y: x[0] + y[0], g1, g2)
假设你有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]]
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.