【问题标题】:Loop over multiple generators together一起循环多个生成器
【发布时间】:2019-07-07 11:01:14
【问题描述】:

我需要同时获取每个生成器的结果,但是生成器的数量可以是 1 到 10 之间的任何值。

我的问题大概和这个问题有关:Loop over two generator together

是否可以将其推广到列表中任意数量的生成器?类似的东西(不工作)

generators = [gen1, gen2, gen3, ....]
for *data in *generators:
    #do something, e.g. average data along axis and write out

【问题讨论】:

  • chain 依次 使用可迭代对象,这是错误的工具。
  • 不幸的是,不是因为它说“从第一个迭代返回元素直到它用完,然后继续到下一个迭代”。但它应该返回每个迭代的第一个元素,然后是第二个,依此类推
  • 您可能需要查看zip,因为它发布在您在问题中链接的问题的答案中。
  • for a, b in zip(it1, it2) 同时使用它们,itertools.chain 迭代第一个然后第二个等等。

标签: python python-3.x loops generator


【解决方案1】:

IIUC 你想要zip。这是一个求和的简单示例:

generators = [(1,2), (3,4), (5,6)]
[sum(i) for i in zip(*generators)]

# [9, 12]

或者@alexis 建议的itertools.zip_longest,如果生成器的长度可能不同,并且您想迭代直到最长的一个被消耗:

generators = [(1,2), (3,4), (5,6,0)]
[sum(i) for i in zip_longest(*generators, fillvalue=0)]
# [9, 12, 0]

【讨论】:

  • itertools.izip_longest,以获得最大的稳健性。
  • 它不是更健壮,只是不同而已。 zipizip_longest 是否合适是您需要针对每个用例决定的事情。 (而且大多数情况下,您压缩的列表具有 - 或 应该 具有 - 相同的长度。)
  • 同样,它不是更健壮。您的用例确定(以[[1,2,3], [4,5]] 为例)忽略第一个列表中的3 或将其与(3, None) 之类的额外值配对是否是正确的事情。
猜你喜欢
  • 2014-01-21
  • 1970-01-01
  • 2023-02-18
  • 2011-10-25
  • 2020-07-04
  • 1970-01-01
  • 2014-06-20
  • 2019-07-25
  • 2021-12-18
相关资源
最近更新 更多