迭代生成器和转换为列表之间的区别

时间:2015-11-18 21:56:00

标签: python

我原本希望这两段代码产生相同的结果

from itertools import groupby

for i in list(groupby('aaaabb')):
    print i[0], list(i[1])

for i, j in groupby('aaaabb'):
    print i, list(j)

在一个实例中,我将groupby返回的迭代器转换为列表并迭代,然后在另一个迭代器中直接迭代返回的迭代器。

此脚本的输出是

a []
b ['b']


a ['a', 'a', 'a', 'a']
b ['b', 'b']

为什么会这样?

修改以供参考,groupby('aabbaa')的结果类似于

('a', <itertools._grouper object at 0x10c1324d0>)
('b', <itertools._grouper object at 0x10c132250>)

1 个答案:

答案 0 :(得分:5)

这是groupby函数的一个怪癖,大概是为了表现。

来自itertools.groupby documentation

  

返回的组本身就是一个迭代器,它与groupby()共享底层的iterable。由于源是共享的,因此当groupby()对象前进时,前一个组不再可见。因此,如果以后需要该数据,则应将其存储为列表:

groups = []
uniquekeys = []
data = sorted(data, key=keyfunc)
for k, g in groupby(data, keyfunc):
    groups.append(list(g))      # Store group iterator as a list
    uniquekeys.append(k)

所以,你可以这样做:

for i in [x, list(y) for x, y in groupby('aabbaa')]:
    print i[0], i[1]