【问题标题】:How to join/merge two generators output using python如何使用 python 加入/合并两个生成器输出
【发布时间】:2012-01-23 02:41:28
【问题描述】:

我有两个生成器 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]


感谢您的帮助。

【问题讨论】:

    标签: python generator itertools


    【解决方案1】:

    第一种情况:使用

    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,则会自动获取生成器。

    【讨论】:

    • 谢谢!我正在同时迭代一个列表和一个生成器。很高兴知道我没有浪费我的发电机。
    【解决方案2】:

    例如,您可以使用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))
    

    【讨论】:

      【解决方案3】:

      您可以使用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)
      

      【讨论】:

      • 您错过了示例中的[0]
      • 无限生成器如何处理内存?使用 izip 怎么样?
      • @joaquin 是的,如果你知道生成器很大或无限,你可以用 itertools.imap 和 itertools.izip 替换 map 和 zip。
      • @Paul Hankin 非常感谢您的帮助
      【解决方案4】:

      假设您有g1g2

      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]]
      

      【讨论】:

        猜你喜欢
        • 2011-03-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-11-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多