値からキーを取得するにはどうすればよいですか?
私の口述:
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
コードを修正するにはどうすればよいですか?
問題は、ディクショナリの値のタイプが同じではなく、このシナリオだけでなく、ディクショナリの使用がはるかに困難になることです。 Pythonはこれを許可しますが、ディクショナリ内の型を統合することを検討する必要があります。たとえば、それらをすべてのリストにします。これは、1行のコードで行うことができます。
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
c={}
-任意の辞書
a(値)-このキーを知っている必要があります
key=list(c.keys())[list(c.values()).index(a)]]
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"
次のコードは、リスト内包表記とdic.items()を使用して、値によって辞書キーを取得する別の短いバージョンを提供します。
keys_have_value = [k for k,v in dic.items() if v=="1"]
次のようなエントリがあるため、半機能コードは他の値を返します。
"Normal UK project" : "1",
..その後"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
def get_Value(dic,value):
for name in dic:
if dic[name] == value:
return name
個人的にはin
と関数values
の方が簡単だと思います。
print 1 in {1:"123", 2:"blah"}
print "blah" in {1:"123", 2:"blah"}.values()
出力は次のとおりです。
True
True