一个接一个地迭代两个列表

时间:2016-02-04 15:36:52

标签: python python-3.x list loops iteration

我有两个数字列表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:,但它有运行时间的代价。

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

3 个答案:

答案 0 :(得分:25)

可以使用 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执行以下操作:

  

创建一个迭代器,它返回第一个iterable中的元素,直到它耗尽,然后进入下一个iterable,直到所有的iterables都用完为止。

如果列表中包含您的列表,则 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略快,但它仍构造一个然后被抛出的列表;只能将其作为最终解决方案。

答案 1 :(得分:2)

chain有效,但是如果您认为导入模块只是为了调用单个函数一次就太过分了,那么您可以内联复制其行为:

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

创建(list1,list2)元组的列表长度为O(1),因此与将列表连接在一起相比,它应该表现良好。

答案 2 :(得分:0)

如何?

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

仅3行