Ich habe eine Funktion erstellt, die das Alter in a nachschlägt Dictionary
und den passenden Namen anzeigt:
dictionary = {'george' : 16, 'amber' : 19}
search_age = raw_input("Provide age")
for age in dictionary.values():
if age == search_age:
name = dictionary[age]
print name
Ich kann das Alter vergleichen und finden. Ich weiß nur nicht, wie ich den Namen der Person anzeigen soll. Außerdem erhalte ich eine KeyError
wegen Zeile 5. Ich weiß, dass sie nicht korrekt ist, aber ich kann nicht herausfinden, wie ich sie rückwärts suchen lassen kann.
python
dictionary
user998316
quelle
quelle
Antworten:
Da ist gar nichts.
dict
ist nicht dazu gedacht, auf diese Weise verwendet zu werden.quelle
Python 3.x
list.items()
anstelle vonlist.iteritems()
sollte verwendet werdendict
kann für mehrere Dinge zu unterschiedlichen Zeiten sein; Schlüssel und Werte haben natürlich eine klare Bedeutung, aber "dict
Elemente mit einem bestimmten Wert" ist eine durchaus vernünftige Anforderung. Die Empfehlung, eine Liste von Paaren zu verwenden, würde den Kontext verwerfen, dass ein Element eine ' Definition ' vom anderen ist, z. B. in Parameterlisten ...Oder in Python 3.x:
Grundsätzlich werden die Werte des Wörterbuchs in einer Liste getrennt, die Position des Werts ermittelt und der Schlüssel an dieser Position abgerufen.
Weitere Informationen zu
keys()
und.values()
in Python 3: Wie kann ich eine Liste mit Werten aus dict abrufen?quelle
list.keys()
undlist.values()
Funktionen Elemente in derselben Reihenfolge?index
Methode versteckt .Wenn Sie sowohl den Namen als auch das Alter möchten , sollten
.items()
Sie(key, value)
Folgendes verwenden, um wichtige Tupel zu erhalten:Sie können das Tupel direkt in der
for
Schleife in zwei separate Variablen entpacken und dann dem Alter anpassen.Sie sollten auch in Betracht ziehen, das Wörterbuch umzukehren, wenn Sie im Allgemeinen nach Alter suchen und keine zwei Personen das gleiche Alter haben:
So können Sie den Namen für ein Alter nachschlagen, indem Sie einfach tun
Ich habe es Aufruf
mydict
statt ,list
dalist
ist der Name einer eingebauten Typ, und Sie sollten diesen Namen nicht für etwas anderes verwenden.Sie können sogar eine Liste aller Personen mit einem bestimmten Alter in einer Zeile abrufen:
oder wenn es nur eine Person mit jedem Alter gibt:
Das gibt dir nur,
None
wenn es niemanden in diesem Alter gibt.Wenn das
dict
lang ist und Sie Python 2 verwenden, sollten Sie die Verwendung.iteritems()
anstelle von.items()
Cat Plus Plus in seiner Antwort in Betracht ziehen , da keine Kopie der Liste erstellt werden muss.quelle
dict
eine Liste von Paaren ersetzen .dict
ist a sinnvoll.value --> key
key --> value
Ich dachte, es wäre interessant, darauf hinzuweisen, welche Methoden in welchem Szenario am schnellsten sind:
Hier sind einige Tests, die ich durchgeführt habe (auf einem 2012 MacBook Pro)
Ergebnisse von
profile.run()
jeder Methode 100000 mal:Methode 1:
Methode 2:
Methode 3:
Dies zeigt also, dass für ein kleines Diktat Methode 1 am schnellsten ist. Dies ist höchstwahrscheinlich darauf zurückzuführen, dass die erste Übereinstimmung zurückgegeben wird, im Gegensatz zu allen Übereinstimmungen wie bei Methode 2 (siehe Hinweis unten).
Interessanterweise erhalte ich bei der Durchführung der gleichen Tests für ein Diktat mit 2700 Einträgen ganz unterschiedliche Ergebnisse (diesmal 10000 Mal ausgeführt):
Methode 1:
Methode 2:
Methode 3:
Hier ist Methode 3 also viel schneller. Nur um zu zeigen, die Größe Ihres Diktats beeinflusst, welche Methode Sie wählen.
Anmerkungen: Methode 2 gibt eine Liste aller Namen zurück, während Methode 1 und 3 nur die erste Übereinstimmung zurückgeben. Ich habe die Speichernutzung nicht berücksichtigt. Ich bin nicht sicher, ob Methode 3 zwei zusätzliche Listen (Schlüssel () und Werte ()) erstellt und diese im Speicher speichert.
quelle
.keys()
und ".values()
Return Dictionary Views", die leicht sind.einzeilige Version: (i ist ein altes Wörterbuch, p ist ein umgekehrtes Wörterbuch)
Erläuterung:
i.keys()
undi.values()
gibt zwei Listen mit Schlüsseln bzw. Werten des Wörterbuchs zurück. Die Zip-Funktion bietet die Möglichkeit, Listen zu verknüpfen, um ein Wörterbuch zu erstellen.Warnung: Dies funktioniert nur, wenn die Werte hashbar und eindeutig sind.
quelle
oder besser
quelle
quelle
lKey = [k for k, v in lDictionary.iteritems() if v == lValue][0] or 'else-key'
Versuchen Sie diesen Einzeiler, um ein Wörterbuch umzukehren:
quelle
Ich fand diese Antwort sehr effektiv, aber für mich nicht leicht zu lesen.
Zur Verdeutlichung können Sie den Schlüssel und den Wert eines Wörterbuchs invertieren. Dies macht die Schlüsselwerte und die Werteschlüssel, wie hier zu sehen .
oder
Das ist im Wesentlichen das gleiche wie diese andere Antwort .
quelle
Wenn Sie den Schlüssel anhand des Werts suchen möchten, können Sie mithilfe eines Wörterbuchverständnisses ein Suchwörterbuch erstellen und dann den Schlüssel anhand des Werts ermitteln.
quelle
Sie können Schlüssel mit Hilfe bekommen
dict.keys()
,dict.values()
undlist.index()
Methoden finden Sie Codebeispiele unter:quelle
search_age
var auf nächste Zeile ... Vielleicht sollten Sie ersetzenvalue
mitsearch_age
?type(dict_values)
wäre nützlich)?Hier ist meine Sicht auf dieses Problem. :) Ich habe gerade angefangen, Python zu lernen, also nenne ich das:
"Das Verständnis für Anfänger" -Lösung.
.
.
quelle
quelle
is
sollte nur verwendet werden , für die Gleichstellung Prüfung von Singletons (None
,True
,False
etc.). Die Tatsache, dass CPython String-Literale wiederverwendet (und dies aucha = 'foobar'; a is 'foobar'
istTrue
), ist ein Implementierungsdetail und sollte nicht als verlässlich angesehen werden.get_key
Wird ausgelöst,StopIteration
wenn der Wert nicht im Wörterbuch vorhanden ist. Es ist besser, ihn zu verwenden,next(..., None)
der zurückgibt,None
wenn der Wert nicht gefunden wird.get_first_key = lambda v, d: next((k for k in d if (v in d[k] is not None)), None)
Erwägen Sie die Verwendung von Pandas. Wie in William McKinneys "Python for Data Analysis" angegeben
Gehen Sie wie folgt vor, um Ihre Serien abzufragen:
Welche Ausbeuten:
Wenn Sie mit der Ausgabe etwas anderes tun müssen, kann es nützlich sein, die Antwort in eine Liste umzuwandeln:
quelle
Hier benötigt recovery_key Wörterbuch und Wert, um im Wörterbuch zu finden. Wir durchlaufen dann die Schlüssel im Wörterbuch und vergleichen sie mit dem Wert und geben diesen bestimmten Schlüssel zurück.
quelle
quelle
wir können das
Key
von bekommendict
durch:quelle
Es wird beantwortet, aber es könnte mit einer ausgefallenen "Map / Reduce" -Verwendung durchgeführt werden, z.
quelle
Cat Plus Plus erwähnte, dass ein Wörterbuch nicht so verwendet werden soll. Hier ist der Grund:
Die Definition eines Wörterbuchs entspricht der eines Mappings in der Mathematik. In diesem Fall ist ein Diktat eine Zuordnung von K (dem Satz von Schlüsseln) zu V (den Werten) - aber nicht umgekehrt. Wenn Sie ein Diktat dereferenzieren, erwarten Sie, dass genau ein Wert zurückgegeben wird. Es ist jedoch völlig legal, dass verschiedene Schlüssel demselben Wert zugeordnet werden, z.
Wenn Sie einen Schlüssel anhand seines entsprechenden Werts nachschlagen, invertieren Sie im Wesentlichen das Wörterbuch. Ein Mapping ist aber nicht unbedingt invertierbar! In diesem Beispiel könnte die Frage nach dem Schlüssel für v1 k1 oder k3 ergeben. Sollten Sie beide zurückgeben? Nur der erste gefunden? Aus diesem Grund ist indexof () für Wörterbücher nicht definiert.
Wenn Sie Ihre Daten kennen, können Sie dies tun. Eine API kann jedoch nicht davon ausgehen, dass ein beliebiges Wörterbuch invertierbar ist, weshalb eine solche Operation fehlt.
quelle
Hier ist meine Meinung dazu. Dies ist gut, um mehrere Ergebnisse anzuzeigen, falls Sie eines benötigen. Also habe ich auch die Liste hinzugefügt
Und das ist es...
quelle
Die Ausgabe ist wie folgt:
quelle
Es gibt keine einfache Möglichkeit, einen Schlüssel in einer Liste zu finden, indem Sie den Wert nachschlagen. Wenn Sie jedoch den Wert kennen und die Schlüssel durchlaufen, können Sie die Werte im Wörterbuch nach dem Element suchen. Wenn D [Element], wobei D ein Wörterbuchobjekt ist, dem Schlüssel entspricht, den Sie suchen möchten, können Sie Code ausführen.
quelle
Sie müssen ein Wörterbuch verwenden und dieses Wörterbuch umkehren. Dies bedeutet, dass Sie eine andere Datenstruktur benötigen. Wenn Sie sich in Python 3 befinden, verwenden Sie das
enum
Modul. Wenn Sie jedoch Python 2.7 verwenden , verwenden Sie das Modul,enum34
das für Python 2 zurückportiert ist.Beispiel:
quelle
quelle
Nur meine Antwort in
lambda
undfilter
.quelle
wurde bereits beantwortet, aber da mehrere Leute das Umkehren des Wörterbuchs erwähnt haben, gehen Sie wie folgt in einer Zeile vor (unter der Annahme einer 1: 1-Zuordnung) und einigen verschiedenen Perf-Daten:
Python 2.6:
2.7+:
Wenn Sie der Meinung sind, dass es nicht 1: 1 ist, können Sie dennoch eine vernünftige umgekehrte Zuordnung mit ein paar Zeilen erstellen:
Wie langsam ist das? Langsamer als eine einfache Suche, aber nicht annähernd so langsam wie man denkt - bei einem "geraden" Wörterbuch mit 100000 Einträgen eine "schnelle" Suche (dh Suche nach einem Wert, der früh in den Tasten sein sollte) war ungefähr 10x schneller als das Umkehren des gesamten Wörterbuchs und eine "langsame" Suche (gegen Ende) ungefähr 4-5x schneller. Nach höchstens 10 Suchvorgängen hat es sich also bezahlt gemacht.
Die zweite Version (mit Listen pro Element) dauert etwa 2,5-mal so lange wie die einfache Version.
Hatte auch einige interessante Ergebnisse mit ifilter. Theoretisch sollte ifilter schneller sein, da wir itervalues () verwenden können und möglicherweise nicht die gesamte Werteliste erstellen / durchgehen müssen. In der Praxis waren die Ergebnisse ... seltsam ...
Für kleine Offsets war es also dramatisch schneller als jede frühere Version (2,36 * u * S gegenüber einem Minimum von 1,48 * m * S für frühere Fälle). Bei großen Offsets gegen Ende der Liste war sie jedoch dramatisch langsamer (15,1 ms gegenüber denselben 1,48 ms). Die kleinen Einsparungen am unteren Ende sind die Kosten am oberen Ende nicht wert, imho.
quelle
[
darin, wenn es ist. Stellen Sie andernfalls sicher, dass es sich um zwei Zeilen handelt, oder setzen Sie eine;
dazwischen, wenn dies nicht der Fall ist.Manchmal kann int () benötigt werden:
quelle
Hier ist eine Lösung, die sowohl in Python 2 als auch in Python 3 funktioniert:
Der Teil bis erstellt
[search_age]
das umgekehrte Wörterbuch (wobei Werte Schlüssel sind und umgekehrt). Sie können eine Hilfsmethode erstellen, die dieses umgekehrte Wörterbuch wie folgt zwischenspeichert:oder noch allgemeiner eine Fabrik, die eine Methode zur Suche nach Namen nach Alter für eine oder mehrere Ihrer Listen erstellt
Sie könnten also Folgendes tun:
Beachten Sie, dass ich umbenannt habe
list
,ages_by_name
da ersterer ein vordefinierter Typ ist.quelle
So greifen Sie auf das Wörterbuch zu, um das zu tun, was Sie wollen:
Natürlich sind Ihre Namen so falsch, dass es so aussieht, als würde es ein Alter drucken, aber es druckt den Namen. Da Sie über den Namen zugreifen, wird es verständlicher, wenn Sie schreiben:
Besser noch:
quelle
Verwenden Sie für mehrere Vorkommen:
quelle
*** NameError: global name 'dictionary' is not defined
filter( lambda x, dictionary=dictionary, search_age=int(search_age): dictionary[x] == search_age , dictionary )