我有一個不同長度的字典。每個條目都有一個名稱和一個列表,如下所示:字典中的相交列表(超過兩個)
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]