假设我有一个结构如下的变量:

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/

10-15 16:09