在字典中找到两个及以上相交列表

3

我有一个长度不一的字典。每个条目都有一个名称和一个列表,格式如下:

somedict = {'Name': [1, 2, 3], 'Name2': [], 'Name3': [2,3] }

如何获取以下列表的交集?我需要动态地执行,不知道字典会有多长。

对于上面的列表,交集将为空,我知道。但是对于

somedict = {'Name': [1, 2, 3], 'Name3': [2,3] }

它应该返回

[2, 3]
2个回答

11

通常,交集是一种集合操作。因此,您可能希望将字典的值转换为集合,然后运行交集,就像这样

>>> 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 函数中。


1
提供另一种使用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]

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接