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