所以我有问题。 我具有此功能,可以获取包含字典作为输入的列表,输出应是一个新字典,其中包含所有输入字典中的键,并作为一个值包含所有键具有的值的列表。
E.G。
d1 = {1: 10, 2: 20, 3: 30, 4: 40, 5: 50}
d2 = {1: 20, 3: 60, 5: 100}
d3 = {1: 10, 7: 70, 5: 55}
print find_intersection([d1, d2, d3])
# prints {1: [10, 10, 20], 5: [50, 55, 100]}
答案 0 :(得分:2)
如果您首先找到keys()
交集,则可以对字典进行理解。
您可以使用__and__
在字典上进行reduce()(感谢UltraInstinct)来构建键的交集。
import operator
# python 3
# from functools import reduce
dicts = [
{1: 10, 2: 20, 3: 30, 4: 40, 5: 50},
{1: 20, 3: 60, 5: 100},
{1: 10, 7: 70, 5: 55}
]
keys = reduce(operator.__and__, map(set, dicts)
{k: [d[k] for d in [d1, d2, d3]] for k in keys}
# {1: [10, 20, 10], 5: [50, 100, 55]}
答案 1 :(得分:0)
您可以在单个for循环中执行此操作。每个输入字典中都不存在的任何键都会引发KeyError
def find_intersection(dicts):
retval = {}
for key in dicts[0]:
try:
retval[key] = [d[key] for d in dicts]
except KeyError:
pass
return retval
答案 2 :(得分:0)
您可以使用defaultdic
,并将值附加到键上。之后,只需查找长度为3的值,就可以得到关键的交点。
from collections import defaultdict
d = defaultdict(list)
d1 = {1: 10, 2: 20, 3: 30, 4: 40, 5: 50}
d2 = {1: 20, 3: 60, 5: 100}
d3 = {1: 10, 7: 70, 5: 55}
for dic in [d1,d2,d3]:
for k,v in dic.iteritems():
d[k].append(v)
d个输出:
defaultdict(list,
{1: [10, 20, 10],
2: [20],
3: [30, 60],
4: [40],
5: [50, 100, 55],
7: [70]})