Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/337.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 迭代生成器和转换为列表之间的区别_Python - Fatal编程技术网

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)]