用itertools.chain连接迭代列表?

9 投票
2 回答
12855 浏览
提问于 2025-04-16 13:14
import itertools
def _yield_sample():
    it = iter(itertools.combinations('ABCD', 2))
    it2 = iter(itertools.combinations('EFGH', 3))
    itc = itertools.chain(it,it2)
    for x in itc:
        yield x

def main():
    for x in _yield_sample():
        print x

这个可以用来打印组合。

>>> 
('A', 'B')
('A', 'C')
('A', 'D')
...

但是这个:

def __position_combination(_count = [2,3,4,5]):
    its = []
    for ct in _count:
        it = iter(itertools.combinations('ABCDEFG', ct))
        its.append(it)
    itc = itertools.chain(its)
    for x in itc:
        yield x

def main():
    for x in __position_combination():
        print x

就不行,它会打印出

>>> 
<itertools.combinations object at 0x02179210>
<itertools.combinations object at 0x02179240>
<itertools.combinations object at 0x02179270>

我得重写代码才能按要求工作。

itc = itertools.chain(*its)

我的问题是:

itertools.chain(iter, iter, iter)  vs    itertools.chain(*[iter,iter,iter])

它们之间有什么不同?根据文档itertools.chain 的作用是:

def chain(*iterables):
    # chain('ABC', 'DEF') --> A B C D E F
    for it in iterables:
        for element in it:
            yield element

那么,为什么itertools.chain(iter, iter, iter)在这里也能工作呢?
这是否意味着iter, iter, iter = *(iter, iter, iter)

2 个回答

4

这是不是意味着 iter, iter, iter = *(iter, iter, iter) 呢?

单独来看并不是这样。参数解包只有在调用函数时才有效,所以下面这两个调用是等价的:

f(1,2,3)
f(*[1,2,3])

但是 *[1,2,3] 不能单独使用,除非它是在一个函数调用中。你可以把普通的(位置)参数和解包的参数混合在一起:

f(1,*[2,3])

所以上面的写法和之前的两个调用也是等价的。

16

撰写回答