python - 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
打印出一个空列表呢?
解决方案
您看到的问题是调用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
-- 什么都没有了。
推荐阅读
- rust - 如何从字符串中修剪换行符?
- python - Beautiful Soup 没有解析所有标签
- java - 如何查看 Google Play Protect 状态?
- python - 使用 Matplotlib 根据日期绘制死亡人数
- python - Pycharm 调试器中 pdb.runcall 的等价物
- java - 有没有办法在elasticsearch java中按顺序生成唯一的Long Id?
- jquery - 正则表达式:不同字符串部分的单独验证不起作用
- javascript - 在 FireFunctions 上 res.send() 后无法获取集合
- three.js - 如何将加载的 gltf 中的所有材料从 mesh basic 转换为 mesh phong?
- embedded - 有关 CGAL 和替代品的信息