我有两个数字列表list1
和list2
,我想用相同的指令迭代它们。像这样:
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:
,但它有运行时间的代价。
有没有办法在没有时间的情况下做到这一点?
答案 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行