我原本希望这两段代码产生相同的结果
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>)
答案 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]