字典中的交叉列表(超过两个)
intersecting lists in a dict (more than two)
我有一个字典,长度不一。每个条目都有一个名称和一个列表,如下所示:
somedict = {'Name': [1, 2, 3], 'Name2': [], 'Name3': [2,3] }
如何获取以下列表的交集?需要动态做,不知道dict要多长
对于上面的列表,我知道交叉点是空的。但是对于
somedict = {'Name': [1, 2, 3], 'Name3': [2,3] }
应该return
[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 to the 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]
我有一个字典,长度不一。每个条目都有一个名称和一个列表,如下所示:
somedict = {'Name': [1, 2, 3], 'Name2': [], 'Name3': [2,3] }
如何获取以下列表的交集?需要动态做,不知道dict要多长
对于上面的列表,我知道交叉点是空的。但是对于
somedict = {'Name': [1, 2, 3], 'Name3': [2,3] }
应该return
[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 to the 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]