2015-12-21 50 views
3

我有一個不同長度的字典。每個條目都有一個名稱和一個列表,如下所示:字典中的相交列表(超過兩個)

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

如何獲得以下列表的交集?我需要動態地做這件事,我不知道這個字典會有多長。

對於上面的列表,我知道路口是空的。但對於

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

它應該返回

[2, 3] 

回答

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())的發電機,其產生轉換成一組的字典項的每一個和每一個值和發電機是unpackedset.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]