Python 迭代生成器和转换为列表之间的区别
我本以为这两段代码会产生相同的结果Python 迭代生成器和转换为列表之间的区别,python,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 [
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>)
('a',)
(‘b’,)
这是groupby
函数的一个怪癖,大概是为了性能
从:
返回的组本身是一个迭代器,它与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]
您可以对列表中的i,j执行
(groupby('aabbaa'):
。不同之处在于,第一个循环创建了迭代器中所有元素的列表,这可能非常大且RAM密集。@ColonelThirtyTwo但为什么输出中存在差异?这实际上无法正常工作(即,它产生与第一个循环相同的结果),尽管我本以为会如此。同样的问题。我的猜测是,groupby
对象只保存对当前组的引用,并丢弃所有以前生成的引用。应该首先对输入进行排序。我希望能够将映射到groupby
的返回值上。这个怪癖会排除这个方法吗?我不会在Python中使用map()
,因为列表理解更容易阅读。但是,如果您想使用map()
,请务必使用。您是否考虑过类似于map(labmda x:x[0]、list(x[1])、groupby('aabbaa'))
?因为这相当于[x,在groupby('aabbaa')中为x,y列出(y)]
。