2017-05-05 55 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