不同集合上元素的迭代-itertools.chain()的使用

不同集合上元素的迭代-itertools.chain()的使用

问题

你想在多个对象执行相同的操作,但是这些对象在不同的容器中,你希望代码在不失可读性的情况下避免写重复的循环。

解决方案

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() 同样可以很好的工作。

不同集合上元素的迭代 — python3-cookbook 3.0.0 文档

推荐阅读更多精彩内容

  • PYTHON-进阶-ITERTOOLS模块小结转自wklken:http://wklken.me/posts/20...
    C_Y_阅读 606评论 0 2
  • 问题 在多个对象上执行相同的操作,但是这些对象在不同的容器中,希望代码在不失可读性的情况下,避免写重复的循环。 解...
    惑也阅读 68评论 0 3
  • 今天看简书,刷新以后,好吧,除了家暴,就是“夜宿门”,好点的也是“D&G”。 其实,对于中国的娱乐圈,虽不说快要“...
    相差12岁的两只小猪阅读 50评论 0 0
  • 一直以来,访问网页总是有很多的小方块广告,不堪其扰。却没有想办法怎样才能屏蔽掉。终于下决心要解决一下,发现goog...
    北方南山阅读 119评论 0 0
  • 从一个地方到另一个地方的流浪,城市的边角,每个人都孤独的像一条狗。 走过的路,遇见的人,只是一个简单的回首,都来不...
    伶寒阅读 136评论 0 0