一个接一个地遍历两个列表

新手上路,请多包涵

我有两个列表 list1list2 数字,我想用相同的指令迭代它们。像这样:

 for item in list1:
  print(item.amount)
  print(item.total_amount)

for item in list2:
  print(item.amount)
  print(item.total_amount)

但这感觉是多余的。我知道我可以写 for item in list1 + list2: ,但它有运行时间的代价。

有没有办法在没有空闲时间的情况下做到这一点?

原文由 zardav 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 790
2 个回答

这可以通过 itertools.chain 来完成:

 import itertools

l1 = [1, 2, 3, 4]
l2 = [5, 6, 7, 8]

for i in itertools.chain(l1, l2):
    print(i, end=" ")

哪个将打印:

 1 2 3 4 5 6 7 8

根据文档, chain 执行以下操作:

创建一个迭代器,返回第一个可迭代对象的元素,直到用尽,然后继续下一个可迭代对象,直到所有可迭代对象都用完。

如果您的列表在列表中,则 itertools.chain.from_iterable 可用:

 l = [l1, l2]
for i in itertools.chain.from_iterable(l):
    print(i, end=" ")

这会产生相同的结果。

如果您不想为此导入模块,则为它编写一个函数非常简单:

 def custom_chain(*it):
    for iterab in it:
        yield from iterab

这需要 Python 3,对于 Python 2,只需 yield 他们使用循环返回:

 def custom_chain(*it):
    for iterab in it:
        for val in iterab:
            yield val

除了前面的,Python 3.5 及其扩展的解包概括,也允许在列表文字中解包:

 for i in [*l1, *l2]:
    print(i, end=" ")

虽然这比 l1 + l2 稍微快一点,但它仍然构建一个列表,然后将其丢弃;只把它作为最终解决方案。

原文由 Dimitris Fasarakis Hilliard 发布,翻译遵循 CC BY-SA 4.0 许可协议

chain 有效,但如果你觉得导入一个模块只是为了调用一次函数是过分的,你可以复制它的内联行为:

 for seq in (list1, list2):
  for item in seq:
    print(item.amount)
    print(item.total_amount)

创建 (list1, list2) 元组在列表长度方面的复杂度为 O(1),因此与将列表串联在一起相比,它的性能应该更好。

原文由 Kevin 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题