4.12 ��集�上元素的迭代¶

问题¶

你想在多个对象执行相�的�作,但是这些对象在��的容器中,你希望代�在�失�读性的情况下��写��的循环。

解决方案¶

itertools.chain() 方法�以用�简化这个任务。 它接�一个�迭代对象列表作为输入,并返回一个迭代器,有效的�蔽掉在多个容器中迭代细节。 为了演示清楚,考虑下�这个例�:

>>> from itertools import chain
>>> a = [1, 2, 3, 4]
>>> b = ['x', 'y', 'z']
>>> for x in chain(a, b):
... print(x)
...
1
2
3
4
x
y
z
>>>

使用 chain() 的一个常�场景是当你想对��的集�中所有元素执行�些�作的时候。比如:

# Various working sets of items
active_items = set()
inactive_items = set()

# Iterate over all items
for item in chain(active_items, inactive_items):
    # Process item

这�解决方案�比�下�这样使用两个�独的循环更加优雅,

for item in active_items:
    # Process item
    ...

for item in inactive_items:
    # Process item
    ...

讨论¶

itertools.chain() 接�一个或多个�迭代对象作为输入�数。 然�创建一个迭代器,�次连续的返回�个�迭代对象中的元素。 这�方��比先将�列�并�迭代�高效的多。比如:

# Inefficent
for x in a + b:
    ...

# Better
for x in chain(a, b):
    ...

第一�方案中, a + b �作会创建一个全新的�列并�求a和b的类型一致。 chian() �会有这一步,所以如果输入�列�常大的时候会很�内存。 并且当�迭代对象类型�一样的时候 chain() �样�以很好的工作。