按值获取键、dict、python

按值获取键、dict、python,python,dictionary,key-value,Python,Dictionary,Key Value,如何从值中获取密钥 我的格言: 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

如何从值中获取密钥

我的格言:

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
如何修复我的代码

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"

问题是字典中的值的类型不同,这使得使用字典变得更加困难,不仅仅是在这种情况下。虽然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

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

    "Normal UK project" : "1",
    "Nordic project" : ["11","12","13","14"],
..然后v中的
“1”检查字符串是否包含“1”字符,而下面的条目:

    "Normal UK project" : "1",
    "Nordic project" : ["11","12","13","14"],
..然后它将检查列表是否包含元素“1”

中的
运算符同时作用于字符串和列表,但方式不同:

>>> "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

我个人认为在
中使用
,函数
更容易

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

True
True

c={}
-任何命令
a(值)-需要知道此键


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


如果“1”==v:
?如果我要查找的值是“12”,那么它将首先失败,您应该统一值的类型。有些是字符串,有些是列表。最好只使用列表(有些列表只有一个元素),这样代码就可以实际工作了,也许字典是错误的?我想这是我要做的事情的副本,但我不确定这样做是否正确,因为有一个项目列表似乎有点多余。非常感谢您的努力。这很有效,但
.index()
将只返回
c
中的
a
的第一个实例,不鼓励只使用代码的答案,因为它们显示回答问题的尝试性较差。
keys_have_value = [k for k,v in dic.items() if v=="1"]