【问题标题】:return key by value in dictionary [duplicate]在字典中按值返回键[重复]
【发布时间】:2013-05-11 09:34:41
【问题描述】:

我正在尝试返回给定值的字典中的键

在这种情况下,如果“b”在字典中,我希望它返回“b”所在的键(即 2)

def find_key(input_dict, value):
    if value in input_dict.values():
        return UNKNOWN            #This is a placeholder
    else:
        return "None"

print(find_key({1:'a', 2:'b', 3:'c', 4:'d'}, 'b'))

我想得到的答案是关键 2,但我不确定该放什么才能得到答案,任何帮助将不胜感激

【问题讨论】:

  • 您确定您的键->值映射正确吗?
  • 您可能会坚持下去,但您的数据结构无法满足您的需求。

标签: python dictionary python-3.x key


【解决方案1】:

返回第一个匹配键:

def find_key(input_dict, value):
    return next((k for k, v in input_dict.items() if v == value), None)

返回所有个匹配键作为一个集合:

def find_key(input_dict, value):
    return {k for k, v in input_dict.items() if v == value}

字典中的值不一定是唯一的。第一个选项返回None,如果没有匹配,第二个返回一个空集。

由于字典的顺序是任意的(取决于所使用的键以及插入和删除历史),因此被视为“第一个”键的也是任意的。

演示:

>>> def find_key(input_dict, value):
...     return next((k for k, v in input_dict.items() if v == value), None)
... 
>>> find_key({1:'a', 2:'b', 3:'c', 4:'d'}, 'b')
2
>>> find_key({1:'a', 2:'b', 3:'c', 4:'d'}, 'z') is None
True
>>> def find_key(input_dict, value):
...     return {k for k, v in input_dict.items() if v == value}
... 
>>> find_key({1:'a', 2:'b', 3:'c', 4:'d'}, 'b')
set([2])
>>> find_key({1:'a', 2:'b', 3:'c', 4:'d', 5:'b'}, 'b')
set([2, 5])
>>> find_key({1:'a', 2:'b', 3:'c', 4:'d'}, 'z')
set([])

请注意,每次我们需要搜索匹配的键时,我们都需要遍历这些值。这不是解决此问题的最有效方法,尤其是当您需要经常将值与键匹配时。在这种情况下,创建一个反向索引:

from collections import defaultdict

values_to_keys = defaultdict(set)

for key, value in input_dict:
    values_to_keys[value].add(key)

现在您可以在 O(1)(常数)时间内直接请求密钥集:

keys = values_to_keys.get(value)

这使用集合;字典也没有排序,所以集合在这里更有意义。

【讨论】:

  • +1 - 关于使用 defaultdict(set) 的好处;)
【解决方案2】:

修改你的函数:

def find_key_for(input_dict, value):    
    for k, v in input_dict.items():
        if v == value:
            yield k

然后获取第一个密钥(或None,如果不存在)

print next(find_key_for(your_dict, 'b'), None)

获取所有位置:

keys = list(find_key_for(your_dict, 'b'))

或者,获取“n”多个键:

from itertools import islice
keys = list(islice(find_key_for(your_dict, 'b'), 5))

注意 - 按照字典的迭代顺序,您获得的键将是 'n' 个。

如果您经常这样做(并且您的值是可散列的),那么您可能希望转置您的 dict

from collections import defaultdict

dd = defaultdict(list)
for k, v in d.items():
    dd[v].append(k)

print dd['b']

【讨论】:

  • 不错。此外,如果值始终是唯一的,则可以在没有 defaultdict 的情况下完成此操作。 rev_d = {v:k for k,v in d.iteritems()}
  • 在关于转置字典的部分,您可能还想添加“并且值是唯一的”。否则你不会真正得到一个完整的转置。但是,很好的答案。 +1
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-02-05
  • 2013-01-02
  • 1970-01-01
  • 2011-12-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多