假设我有一个结构如下的变量:
results = [([123], 456),
([1, 2, 3], 456),
([2], 456)]
我想通过字典理解把它编入字典,我做到了:
{item[1]:set(i for item in results for i in item[0]) for item in results}
{456: {1, 2, 3, 123}}
但是现在假设变量
results
变成:[([123], 456),
([1, 2, 3], 456),
([2], 456),
([789], 'fizz')]
我试图改变对这个案子的理解,但没有成功。如何通过字典理解来达到这个结果?我知道如何使用循环,但我想学习如何通过理解来实现这一点。谢谢!
编辑:
输出如下:
{456: {1, 2, 3, 123}, 'fizz': {789}}
最佳答案
不需要理解就可以很容易地做到这一点,但是如果你坚持要理解,这里有一个使用itertools.groupby
的解决方案:
from itertools import groupby
import operator
f = operator.itemgetter(1)
r = {k: set(i for x in g for i in x[0]) for k, g in groupby(results, f)}
print(r)
# {456: set([3, 1, 2, 123]), 'fizz': set([789])}
注意:由于项目已经按照组键排列,因此不会进行预排序。
通过使用
defaultdict
的简单for循环,解决方案更具可读性(比如说更多的Pythonic):from collections import defaultdict
r = defaultdict(set)
for v, k in results:
r[k].update(v)
print(r)
# defaultdict(<type 'set'>, {456: set([3, 1, 2, 123]), 'fizz': set([789])})
关于python - 从元组列表中包含列表的字典理解,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/43261075/