web-dev-qa-db-ja.com

値、辞書、python

値からキーを取得するにはどうすればよいですか?

私の口述:

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

コードを修正するにはどうすればよいですか?

8
Boosted_d16

問題は、ディクショナリの値のタイプが同じではなく、このシナリオだけでなく、ディクショナリの使用がはるかに困難になることです。 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
7
tobias_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"
3
thefourtheye

次のコードは、リスト内包表記とdic.items()を使用して、値によって辞書キーを取得する別の短いバージョンを提供します。

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

次のようなエントリがあるため、半機能コードは他の値を返します。

    "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
2
dbr
def get_Value(dic,value):
    for name in dic:
        if dic[name] == value:
            return name
0
Raj Damani

個人的にはinと関数valuesの方が簡単だと思います。

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

出力は次のとおりです。

True
True
0
Ehsan Ab