【问题标题】:get Key by value, dict, python按值、字典、python 获取键
【发布时间】:2014-06-11 07:08:34
【问题描述】:

如何从值中获取键?

我的口号:

countries = {
        "Normal UK project" : "1",
        "UK Omnibus project" : "1-Omni",
        "Nordic project" : ["11","12","13","14"],
        "German project" : "21",
        "French project" : "31"
        }

我的半功能代码:

for k, v in countries.items():
    if "1" in v:
        print k

预期输出:

Normal UK project

实际输出:

French project
UK Omnibus project
German project
Normal UK project

如何修复我的代码?

【问题讨论】:

  • if "1" == v:?
  • 如果我要查找的值是“12”,那么它将失败
  • 首先,你应该统一你的值的类型。有些是字符串,有些是列表。最好只使用列表(有些只有一个元素),这样您的代码才能真正起作用。
  • 如果你经常发现自己试图从 value 中获取 key,也许字典是错误的方式?
  • 我认为这是stackoverflow.com/questions/8023306/…的副本

标签: python dictionary key-value


【解决方案1】:

问题是字典中的值的类型不一样,这使得字典的使用变得更加困难,不仅在这种情况下。虽然 Python 允许这样做,但您确实应该考虑统一字典中的类型,例如将它们全部列出。只需一行代码即可:

countries = {key: val if isinstance(val, list) else [val] 
                        for key, val in countries.items()}

现在,每个字符串都被包装到一个列表中,您现有的代码将正常工作。

或者,如果您必须使用当前形式的字典,您可以调整您的查找功能:

for k, v in countries.items():
    if "1" == v or isinstance(v, list) and "1" in v:
        print k

【讨论】:

    【解决方案2】:

    c={} - 任何字典
    a(value) - 需要知道这个键

    key=list(c.keys())[list(c.values()).index(a)]]
    

    【讨论】:

    • 这可行,但.index() 只会返回ca 的第一个实例
    【解决方案3】:

    以下代码提供了另一个简短版本,通过使用列表推导和 dic.items() 按某个值获取字典键:

    keys_have_value = [k for k,v in dic.items() if v=="1"]
    

    【讨论】:

    • 不鼓励仅使用代码的答案,因为它们表明回答问题的尝试很差。
    【解决方案4】:
    def keys_of_value(dct, value):
        for k in dct:
            if isinstance(dct[k], list):
                if value in dct[k]:
                    return k
            else:
                if value == dct[k]:
                    return k
    
    assert keys_of_value(countries, "12") == "Nordic project"
    assert keys_of_value(countries, "1")  == "Normal UK project"
    

    如果你想让我把它缩短一点,我可以做

    from operator import eq, contains
    
    def keys_of_value(dct, value, ops = (eq, contains)):
        for k in dct:
            if ops[isinstance(dct[k], list)](dct[k], value):
                return k
    
    assert keys_of_value(countries, "12") == "Nordic project"
    assert keys_of_value(countries, "1") == "Normal UK project"
    

    【讨论】:

    • 感谢您的努力。
    【解决方案5】:

    您的半功能代码正在返回其他值,因为条目如下:

        "Normal UK project" : "1",
    

    ..then "1" in v 检查字符串是否包含“1”字符,而条目如下:

        "Nordic project" : ["11","12","13","14"],
    

    ..然后它将检查列表是否包含元素“1”。

    in 运算符适用于字符串和列表,但方式不同:

    >>> "1" in "123"
    True
    >>> "1" in ["123", "blah"]
    False
    >>> "1" in ["1", "blah"]
    True
    

    理想情况下,您的数据会更加一致 - 所有列表或所有字符串:

    countries = {
            "Normal UK project" : ["1"],
            "UK Omnibus project" : ["1-Omni"],
            "Nordic project" : ["11","12","13","14"],
            "German project" : ["21"],
            "French project" : ["31"]
            }
    
    for k, v in countries.items():
        if "1" in v:
            print k
    

    【讨论】:

    • 我打算这样做,但我不确定这样做是否正确,因为列出一个项目似乎有点多余。
    【解决方案6】:

    我个人认为使用in 和函数values 更容易。

    print 1 in {1:"123", 2:"blah"}
    print "blah" in {1:"123", 2:"blah"}.values()
    

    输出是:

    True
    True
    

    【讨论】:

      【解决方案7】:
      def get_Value(dic,value):
          for name in dic:
              if dic[name] == value:
                  return name
      

      【讨论】:

        猜你喜欢
        • 2011-01-27
        • 2011-12-22
        • 2022-12-05
        • 2012-03-03
        • 2017-01-29
        相关资源
        最近更新 更多