假设我有一个结构如下的变量:
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}}
但是现在假设变量结果
变成这样:
[([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 循环,该解决方案更具可读性(更具 Python 风格):
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/