首页 > 解决方案 > itertools.groupby() 值消失

问题描述

我有一个嵌套列表[['A','B'],['A','C'],['D'],['C','A']]

import itertools
d = {}
for key, group in itertools.groupby([['A','B'],['A','C'],['D'],['C','A']], lambda x: x[0]):
    d[key] = list(group)
print(d)

现在我会有{'A': [['A', 'B'], ['A', 'C']], 'D': [['D']], 'C': [['C', 'A']]}

但是,由于 'D' 是唯一具有单个元素的嵌套列表,我希望所有单个元素都打印为 number 0

我想输出:{'A': [['A', 'B'], ['A', 'C']], 'D': 0, 'C': [['C', 'A']]},所以我添加了一个 if-else 子句并将我的代码更改为:

for key, group in itertools.groupby([['A','B'],['A','C'],['D'],['C','A']], lambda x: x[0]):
    if len(list(group)[0]) > 1:
        d[key] = list(group)
    else: d[key] = 0
print(d)

但是,上面的代码打印为{'A': [], 'D': 0, 'C': []}. 我没有发现我的代码有任何问题。A但是,为什么要C打印出一个空列表呢?

标签: pythonpython-3.xcomputer-science

解决方案


您看到的问题是调用list(group)inside 的第一次调用耗尽了指向len的迭代器;group你只能使用一次。因此,您需要将值保存在临时列表中。

你可以做:

import itertools 

d = {}
li=[['A','B'],['A','C'],['D'],['C','A']]

for key, group in itertools.groupby(li, lambda x: x[0]):
    gv=list(group)
    if len(gv) > 1:
        d[key] = gv
    else: d[key] = 0
    
print(d)
# {'A': [['A', 'B'], ['A', 'C']], 'D': 0, 'C': 0}

您还可以缩短一点:

for key, group in itertools.groupby(li, lambda x: x[0]):
    gv=list(group)
    d[key]=gv if len(gv) > 1 else 0

你问我第一次在哪里使用生成器?

考虑以下示例:

>>> gen=(x*2 for x in (1,2,3))  # a generator expression
>>> type(gen)
<class 'generator'>
>>> list(gen)
[2, 4, 6]
>>> list(gen)
[]

如果您list在发电机上使用,则会耗尽发电机。你使用list(group)里面的len排气发电机。你第二次打电话给list-- 什么都没有了。


推荐阅读