按值、字典、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()
只会返回c
中a
的第一个实例【参考方案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 获取键的主要内容,如果未能解决你的问题,请参考以下文章