2012-07-24 11 views
13

Mögliche Duplizieren:
Inverse dictionary lookup - Python
reverse mapping of dictionary with PythonPython: Schlüssel des Index im Wörterbuch erhalten

Wie bekomme ich Schlüssel des Index im Wörterbuch?

Zum Beispiel wie:

i = {'a': 0, 'b': 1, 'c': 2} 

so, wenn ich Schlüssel i erhalten möchten [0], wird er zurückkehren 'a'

+0

Sie wollen den Wert * zur Karte * zurück zum Schlüssel. In einem Python-Diktat gibt es keinen Index. –

+0

Siehe http://stackoverflow.com/questions/3221475/reverse-mapping-of-dictionary-with-python und http://stackoverflow.com/questions/483666/python-reverse-inverse-a-mapping –

Antwort

5

Definitions Wörterbücher sind ungeordnet und deshalb nicht indiziert werden können. Verwenden Sie für diese Funktionalität ein geordnetes Wörterbuch. Python Ordered Dictionary

+0

'OrderedDict 's können auch nicht indiziert werden. – Julian

+0

Wahr, aber wenn dict.keys() oder dict.values ​​() aufgerufen werden, wird die Reihenfolge beibehalten. Der Index dieser Listen entspricht also dem "Index" des Wörterbuchs – underbar

17

Python-Wörterbücher haben einen Schlüssel und einen Wert, wonach Sie fragen, welche Schlüssel auf einen bestimmten Wert zeigen.

Sie können dies in einer Schleife nur tun:

[k for (k, v) in i.iteritems() if v == 0] 

Hinweis, dass es in einem dict pro Wert mehr als ein Schlüssel sein; {'a': 0, 'b': 0} ist vollkommen legal.

wenn Sie möchten die Bestellung entweder benötigen eine Liste oder eine OrderedDict instance stattdessen verwenden:

items = ['a', 'b', 'c'] 
items.index('a') # gives 0 
items[0]   # gives 'a' 
+1

. Ich glaube nicht, dass er das gefragt hat. Er möchte mit einer nummerierten Position "indexieren", wie in einer Liste –

+0

@PaulSeeb: wir raten, was das OP bedeutet, mal sehen, ob es irgendwelche Klärungen geben wird. –

16

Sie so etwas tun könnte:

i={'foo':'bar', 'baz':'huh?'} 
keys=i.keys() #in python 3, you'll need `list(i.keys())` 
values=i.values() 
print keys[values.index("bar")] #'foo' 

aber Sie jederzeit Ihre ändern Wörterbuch, müssen Sie Ihre Schlüssel, Werte aktualisieren, weil Wörterbücher nicht bestellt werden. Jedes Mal, wenn Sie ein neues Schlüssel/Wert-Paar einfügen, geht die Reihenfolge, die Sie dachten, verloren und wird durch eine neue (mehr oder weniger zufällige) Reihenfolge ersetzt. Daher ist es nicht sinnvoll, nach dem Index in einem Wörterbuch zu fragen.

Beachten Sie auch, dass das, was Sie fragen, wahrscheinlich nicht das ist, was Sie wirklich wollen. Es gibt keine Garantie, dass das inverse Mapping in einem Dictionary eindeutig ist. Mit anderen Worten: Sie folgenden Wörterbuch haben könnten:

d={'i':1, 'j':1} 

In diesem Fall ist es unmöglich zu wissen, ob Sie i oder j wollen und in der Tat wird hier keine Antwort in die Lage, Ihnen zu sagen, welche ('i' oder 'j') wird ausgewählt (weil Wörterbücher nicht geordnet sind). Was willst du in dieser Situation tun? Sie könnten eine Liste mit akzeptablen Schlüsseln erhalten ... aber ich vermute, dass Ihr grundlegendes Verständnis von Wörterbüchern nicht ganz richtig ist.

+0

Ich denke, deine Antwort ist sehr irreführend. Wörterbücher sind ungeordnet. Sie sollten keine Arbeit auf etwas veröffentlichen, das der Programmierlogik grundsätzlich widerspricht. –

+0

@PaulSeeb - Ich habe aktualisiert. Hilft das überhaupt? – mgilson

+0

@PaulSeeb - Und warum denkst du, dass ich all das hinzugefügt habe, "was du verlangst, ist wahrscheinlich nicht das, was du willst" und "Ich vermute, dein grundlegendes Verständnis von Wörterbüchern ist nicht ganz richtig"? – mgilson

0

Per def. Dictionary ist ungeordnete Sammlung von Schlüssel-Wert-Paar. Sie können also keinen Index für das Schlüssel/Wert-Paar haben. Sie können sie in zwei geordneten Listen mit demselben Indexwert für Schlüssel und Wert speichern. Dann können Sie für jeden Schlüssel in einem bestimmten Index in der Schlüsselliste den zugehörigen Wert aus der Werteliste abrufen.

ODER besser, ein bestelltes Wörterbuch zu verwenden.

d = OrderedDict([('first', 1), 

... ('zweite', 2), ... ('dritte', 3)])

prüfen diese ordered list

Verwandte Themen