2016-11-14 147 views
3

我有以下的解释:如何根据列表中的值获取作为字典值的列表?

d = {'1' : [1, 2, 3, 4], '2' : [10, 20, 30, 40]} 

我如何得到相应的键,我从列表中的一个值搜索? 比方说,我想关键的“1”,如果我在寻找价值3或键“2”如果我在寻找价值10

+1

如果多个键匹配会怎样? – thefourtheye

+0

情况并非如此。每个键代表字典中唯一的。 – Binary

+0

@二进制:键在字典中总是唯一的。重要的是如果列表*中的*值是唯一的。 –

回答

4

您可以使用一台发电机表达过滤条件,这样

>>> def get_key(d, search_value): 
...  return next(key for key, values in d.items() if search_value in values) 
... 
>>> get_key(d, 10) 
'2' 
>>> get_key(d, 2) 
'1' 

如果没有键包含正在搜索的值,则返回None

>>> get_key(d, 22) 
None 
5

可以扭转字典到这个结构做那种查找:

reverse_d = { 
    1: '1', 
    2: '1', 
    3: '1', 
    4: '1', 
    10: '2', 
    … 
} 

可以通过遍历每个键的每个值来构建:

reverse_d = {} 

for key, values in d.items(): 
    for value in values: 
     reverse_d[value] = key 

或作为词典理解更简洁:

reverse_d = {value: key for key, values in d.items() for value in values} 

查找现在很简单!

k = reverse_d[30] 
# k = '2' 

但是,如果您执行多个查找,只会提供比搜索整个原始字典更好的性能。

1

这是我第一次回答问题。这个方法怎么样?

def get_key(d,search_value): 
     res = [] 
     for v in d.items(): 
       if search_value in v[1]: 
         res.append(v[0]) 
     return res 

>>> D = {'a':[2,2,3,4,5],'b':[5,6,7,8,9]} 
>>> getkey.get_key(D,2) 
['a'] 
>>> getkey.get_key(D,9) 
['b'] 
>>> getkey.get_key(D,5) 
['a', 'b']