我有一个不同长度的字典。每个条目都有一个名称和一个列表,如下所示:字典中的相交列表(超过两个)
somedict = {'Name': [1, 2, 3], 'Name2': [], 'Name3': [2,3] }
如何获得以下列表的交集?我需要动态地做这件事,我不知道这个字典会有多长。
对于上面的列表,我知道路口是空的。但对于
somedict = {'Name': [1, 2, 3], 'Name3': [2,3] }
它应该返回
[2, 3]
我有一个不同长度的字典。每个条目都有一个名称和一个列表,如下所示:字典中的相交列表(超过两个)
somedict = {'Name': [1, 2, 3], 'Name2': [], 'Name3': [2,3] }
如何获得以下列表的交集?我需要动态地做这件事,我不知道这个字典会有多长。
对于上面的列表,我知道路口是空的。但对于
somedict = {'Name': [1, 2, 3], 'Name3': [2,3] }
它应该返回
[2, 3]
通常情况下,交叉点是一组操作。所以,你可能想如果你想要得到的结果是一个列表,字典的值转换成集,然后运行路口,像这样
>>> set.intersection(*(set(values) for values in data.values()))
{2, 3}
,只是转换所得到的设置列表,这样
>>> list(set.intersection(*(set(values) for values in data.values())))
[2, 3]
在这里,表达,创建*(set(values) for values in data.values())
的发电机,其产生转换成一组的字典项的每一个和每一个值和发电机是unpacked到set.intersection
功能。
提供使用reduce
的另一种方法。
reduce(lambda x,y: set(x) & set(y), the_list)
它的行为方式是像(例如the_list = [[1, 2, 3], [], [2,3]]
):
set([1,2,3]) & set([]) => tmp_result
set(tmp_result) & set([2,3]) => final_result
因此该解决方案将是:
>>> dict_one = {'Name': [1, 2, 3], 'Name2': [], 'Name3': [2, 3]}
>>> reduce(lambda x,y: set(x) & set(y), dict_one.values())
set([])
>>> dict_two = {'Name': [1, 2, 3], 'Name3': [2, 3]}
set([2, 3])
>>> list(dict_two)
[2, 3]