2017-05-05 71 views
-2

我需要通過匹配列表中的項來查找包含值的字典中的鍵。我的方法是如下...查找字典值中是否存在列表項並獲取密鑰

dict1 = {'a':[1,3,4], "b": [3,4,6], 'c': [88,22,1]} 
list1 = [1,3] 
links = [] 
dict2 = {} 
for key, value in dict1.iteritems(): 
    for link in list1: 
     if link in dict1[key]: 
      links.append(link) 
      temp = links 
      dict2[key]=temp 
      links[:]=[] 

print dict2 

我想輸出是

{'a': [1,3], 'c': 1, 'b': 3} 

但與上面的代碼我得到...

{'a': [], 'c': [], 'b': []} 

有人可以請解釋在哪裏我錯了。這裏任何幫助將高度讚賞

+0

'for'循環中的代碼被錯誤地縮進。結果取決於您如何實際縮進代碼。請更新您的問題。 – DyZ

回答

4

下面是一個簡單的實現:

>>> dict1 = {'a':[1,3,4], "b": [3,4,6], 'c': [88,22,1]} 
>>> list1 = [1,3] 
>>> res = {} 
>>> for k, v in dict1.iteritems(): 
...  if any(i in v for i in list1): 
...   res[k] = [i for i in v if i in list1] 
... 
>>> res 
{'b': [3], 'c': [1], 'a': [1, 3]} 

至於你原來的解決方案,它與變量的作用域和縮進的問題。這裏是,將工作溶液:

dict1 = {'a':[1,3,4], "b": [3,4,6], 'c': [88,22,1]} 
list1 = [1,3] 

dict2 = {} 
for key, value in dict1.iteritems(): 
    links = [] 
    for link in list1: 
     if link in dict1[key]: 
      links.append(link) 
    dict2[key] = links 

print(dict2) 
+0

用'items()'替換Python3的iteritems()' – brianpck

+0

謝謝。我打算將此應用於我正在構建的履帶式機器上。從效率的角度來看,這是一個更好的解決方案,可以處理帶有1000個鍵和值的字典嗎? –

+0

他們的表現幾乎相同。需要注意的一點是,我的解決方案排除了任何沒有匹配值的鍵 - 如果您不想要這種行爲,只需刪除'if any()'行。 – brianpck

2

一個班輪:

dict1 = {'a':[1,3,4], "b": [3,4,6], 'c': [88,22,1]} 
list1 = [1,3] 

res = {key : list(set(value) & set(list1)) for key, value in dict1.items()} 

set1=set(list1)可以預先計算效率。

+1

非常優雅的解決方案! – MaxU

相關問題