【问题标题】:How to get key of a value in python dictionary? [duplicate]如何在python字典中获取值的键? [复制]
【发布时间】:2014-02-18 08:37:11
【问题描述】:

字典值是列表:

dictionary_1 = {"ABC": [1,2,3], "DEF":[4,5,6]}

如何从python中的dictionary_1获取5的密钥,即"DEF"

【问题讨论】:

  • 你的意思是你有5的输入并且你想返回"DEF"?还是反过来?
  • 您可能想要使用双向字典:pypi.python.org/pypi/bidict/0.1.1
  • @lc。是的,我有5,我想获取它的密钥(id 为“DEF”)。
  • @simonzack 该问题的答案看起来不像下面发布的答案。因为它们不是重复的。
  • @alwbtc:但它们密切相关。检查侧边栏中的链接帖子。

标签: python dictionary


【解决方案1】:

你可以创建 reverse dict:

>>> d = {i:k for k,v in dictionary_1.items() for i in v}
>>> d
{1: 'ABC', 2: 'ABC', 3: 'ABC', 4: 'DEF', 5: 'DEF', 6: 'DEF'}
>>> d[5]
'DEF'

【讨论】:

  • 如果值是唯一的..
  • 这是一个不错的选择,因为操作想要默认为一个键 GHJ(在我的答案中的 cmets 中)。所以你可以打电话给d.get(5, "GHJ")
【解决方案2】:

您必须在字典中搜索:

try:
    key = next(k for k, v in dictionary_1.iteritems() if 5 in v)
except StopIteration:
    raise KeyError('Key for 5 not found')

这假设您正在寻找 a 键。要查找 all 键,您可以使用列表推导:

keys = [k for k, v in dictionary_1.iteritems() if 5 in v]

列表可能为空。

【讨论】:

  • 没见过这样使用next..谢谢。
  • @alwbtc:如果您想要默认值,请使用此 key = next((k for k, v in d.iteritems() if 9 in v), 'GHJ') 并删除 try..except。
【解决方案3】:

可能是这样的?

my_value = 5
for k, v in dictionary_1.iteritems():
    if my_value in v:
        print k
        break
else:
    print "No key, defaulting to GHJ"

演示:

    In [12]: my_value = 8

    In [13]: for k, v in dictionary_1.iteritems():
        if my_value in v:
            print "Key for %s is %s" % (my_value, k)
            break
    else:
        print "No key found for %s, defaulting to GHJ" % my_value

    No key found for 8, defaulting to GHJ

【讨论】:

  • 如果字典中没有找到item,那么它应该返回一个默认值,比如“GHJ”。上面你会怎么做?
  • @alwbtc 更新了我的答案。是for/else模式,如果没有找到key,代码永远不会break而执行else子句。
【解决方案4】:

一种方法是:

dictionary_1 = {"ABC": [1,2,3], "DEF":[4,5,6]}
for k, v in dictionary_1.items():
    if 5 in v:
        print(k)

【讨论】:

    【解决方案5】:

    假设您可以检查 5 是否在 [4,5,6] 列表​​中,您也可以尝试:

    dictionary_1 = {"ABC": [1,2,3], "DEF":[4,5,6]}
    
    print dictionary_1.keys()[dictionary_1.values().index([4,5,6])] 
    

    【讨论】:

      猜你喜欢
      • 2016-06-24
      • 1970-01-01
      • 2014-06-11
      • 1970-01-01
      • 2019-02-04
      • 2013-08-27
      • 1970-01-01
      • 2021-09-03
      • 2016-01-19
      相关资源
      最近更新 更多