webentwicklung-frage-antwort-db.com.de

schlüssel nach Wert, Dikt, Python abrufen

Wie kann ich einen Schlüssel aus einem Wert erhalten? 

mein dikt: 

countries = {
        "Normal UK project" : "1",
        "UK Omnibus project" : "1-Omni",
        "Nordic project" : ["11","12","13","14"],
        "German project" : "21",
        "French project" : "31"
        }

mein halb funktionierender Code:

for k, v in countries.items():
    if "1" in v:
        print k

erwartete Ausgabe:

Normal UK project

tatsächliche Leistung: 

French project
UK Omnibus project
German project
Normal UK project

Wie kann ich meinen Code korrigieren? 

8
Boosted_d16

Das Problem ist, dass die Wertetypen im Wörterbuch nicht identisch sind, was die Verwendung des Wörterbuchs erheblich erschwert, nicht nur in diesem Szenario. Während Python dies zulässt, sollten Sie wirklich die Typen im Wörterbuch vereinheitlichen, z. mache sie alle Listen. Sie können dies in nur einer Codezeile tun:

countries = {key: val if isinstance(val, list) else [val] 
                        for key, val in countries.items()}

Jetzt wird jede einzelne Zeichenfolge in eine Liste eingebunden, und der vorhandene Code funktioniert ordnungsgemäß.

Wenn Sie das Wörterbuch in seiner aktuellen Form verwenden müssen, können Sie alternativ Ihre Suchfunktion anpassen:

for k, v in countries.items():
    if "1" == v or isinstance(v, list) and "1" in v:
        print k
7
tobias_k

c={} - irgendein Dikt
a (Wert) - müssen Sie diesen Schlüssel kennen

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"

Wenn Sie möchten, dass ich es etwas kürzer mache, könnte ich das tun

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

Der folgende Code bietet eine weitere und kurze Version des Abrufs von Wörterbuchschlüsseln nach einem bestimmten Wert mithilfe von List Comprehensions und dic.items ():

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

Ihr semi-funktionsfähiger Code gibt die anderen Werte zurück, weil bei Einträgen wie:

    "Normal UK project" : "1",

..then "1" in v prüft, ob die Zeichenfolge das Zeichen "1" enthält, bei Einträgen wie:

    "Nordic project" : ["11","12","13","14"],

..dann wird geprüft, ob die Liste ein Element "1" enthält.

Der in-Operator funktioniert sowohl für Strings als auch für Listen, jedoch auf unterschiedliche Weise:

>>> "1" in "123"
True
>>> "1" in ["123", "blah"]
False
>>> "1" in ["1", "blah"]
True

Idealerweise sind Ihre Daten konsistenter - alle Listen oder alle Zeichenfolgen:

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

Ich persönlich denke, dass in und die Funktion values einfacher ist. 

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

Ausgabe ist: 

True
True
0
Ehsan Ab