按值、字典、python 获取键

Posted

技术标签:

【中文标题】按值、字典、python 获取键【英文标题】:get Key by value, dict, 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,也许字典是错误的方式? 我认为这是***.com/questions/8023306/…的副本 【参考方案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

【讨论】:

以上是关于按值、字典、python 获取键的主要内容,如果未能解决你的问题,请参考以下文章

按值获取字典键

在python中按值删除字典项的最佳方法是啥? [复制]

如何按值对 Python 字典进行排序? [复制]

在字典中按值获取键

Python - 字典按值(value)排序

python 按值排序字典