Python 排序itertools.groupby的奇怪行为

Python 排序itertools.groupby的奇怪行为,python,itertools,Python,Itertools,我正在努力理解groupby软件包itertools的工作原理。我正在输入一个排序列表,但我无法访问单个组 例如: import itertools sorted_types = [ dict(type="a", value=":-o" ), dict(type="a", value=":-P" ), dict(type="b", value=":-(" ), dict(type="b

我正在努力理解
groupby
软件包
itertools
的工作原理。我正在输入一个排序列表,但我无法访问单个组

例如:

import itertools
sorted_types =   [ dict(type="a", value=":-o" ),
                  dict(type="a", value=":-P" ),
                  dict(type="b", value=":-(" ),
                  dict(type="b", value=":-|" ),
                ]
groups = []
for k, g in itertools.groupby(sorted_types, lambda x: x["type"]):
    groups.append(list(g))
    print k, list(g), len(list(g))
print groups
这个程序的输出是

a [] 0
b [] 0
[[{'type': 'a', 'value': ':-o'}, {'type': 'a', 'value': ':-P'}], [{'type': 'b', 'value': ':-('},   {'type': 'b', 'value': ':-|'}]]
如果大小
list(g)
为0,为什么要更新
groups
变量


我很困惑。

groupby
返回的
g
是一个迭代器,如下所述:

返回的组本身是一个迭代器,它共享底层 iterable with groupby()

一旦你第一次调用它的
list(g)
,你就把它累坏了。在随后的所有调用中,您都会得到一个空列表,因为您在一个耗尽的迭代器上调用
list()

要获得预期的输出,请先存储列表,然后使用它:

import itertools
sorted_types =   [ dict(type="a", value=":-o" ),
                  dict(type="a", value=":-P" ),
                  dict(type="b", value=":-(" ),
                  dict(type="b", value=":-|" ),
                ]   
groups = []
for k, g in itertools.groupby(sorted_types, lambda x: x["type"]):
    l = list(g)
    groups.append(l)
    print k, l, len(l)
print groups
输出:

a [{'type': 'a', 'value': ':-o'}, {'type': 'a', 'value': ':-P'}] 2
b [{'type': 'b', 'value': ':-('}, {'type': 'b', 'value': ':-|'}] 2
[[{'type': 'a', 'value': ':-o'}, {'type': 'a', 'value': ':-P'}], [{'type': 'b', 'value': ':-('}, {'type': 'b', 'value': ':-|'}]]

groupby
返回的
g
是一个迭代器,如中所述:

返回的组本身是一个迭代器,它共享底层 iterable with groupby()

一旦你第一次调用它的
list(g)
,你就把它累坏了。在随后的所有调用中,您都会得到一个空列表,因为您在一个耗尽的迭代器上调用
list()

要获得预期的输出,请先存储列表,然后使用它:

import itertools
sorted_types =   [ dict(type="a", value=":-o" ),
                  dict(type="a", value=":-P" ),
                  dict(type="b", value=":-(" ),
                  dict(type="b", value=":-|" ),
                ]   
groups = []
for k, g in itertools.groupby(sorted_types, lambda x: x["type"]):
    l = list(g)
    groups.append(l)
    print k, l, len(l)
print groups
输出:

a [{'type': 'a', 'value': ':-o'}, {'type': 'a', 'value': ':-P'}] 2
b [{'type': 'b', 'value': ':-('}, {'type': 'b', 'value': ':-|'}] 2
[[{'type': 'a', 'value': ':-o'}, {'type': 'a', 'value': ':-P'}], [{'type': 'b', 'value': ':-('}, {'type': 'b', 'value': ':-|'}]]

问题是
list(g)
消耗
g
,因此在同一
groupby()
迭代过程中再次调用它会返回一个空列表

要修复此问题,请调用一次并保留结果:

for k, g in itertools.groupby(sorted_types, lambda x: x["type"]):
    l = list(g)
    groups.append(l)
    print k, l, len(l)
print groups

问题是
list(g)
消耗
g
,因此在同一
groupby()
迭代过程中再次调用它会返回一个空列表

要修复此问题,请调用一次并保留结果:

for k, g in itertools.groupby(sorted_types, lambda x: x["type"]):
    l = list(g)
    groups.append(l)
    print k, l, len(l)
print groups