Betrachten Sie ein Dikt wie
mydict = {
'Apple': {'American':'16', 'Mexican':10, 'Chinese':5},
'Grapes':{'Arabian':'25','Indian':'20'} }
Wie greife ich beispielsweise auf ein bestimmtes Element dieses Wörterbuchs zu? Zum Beispiel möchte ich das erste Element nach einer Formatierung des ersten Elements von Apple drucken, das in unserem Fall nur "amerikanisch" ist.
Zusätzliche Informationen Die obige Datenstruktur wurde durch Parsen einer Eingabedatei in einer Python-Funktion erstellt. Einmal erstellt, bleibt es jedoch für diesen Lauf gleich.
Ich benutze diese Datenstruktur in meiner Funktion.
Wenn sich die Datei ändert, ist der Inhalt der Datei beim nächsten Ausführen dieser Anwendung unterschiedlich, und daher ist der Inhalt dieser Datenstruktur unterschiedlich, aber das Format ist dasselbe. Sie sehen also, ich weiß in meiner Funktion nicht, dass das erste Element in Apple "amerikanisch" oder etwas anderes ist, daher kann ich "amerikanisch" nicht direkt als Schlüssel verwenden.
quelle
dict
. Das Wort 'dict' ist in Python bereits ein Schlüsselwort. Verwenden Sie etwas anderes, wiemydict
.Antworten:
Da es sich um ein Wörterbuch handelt, greifen Sie mit den Schlüsseln darauf zu. Gehen Sie wie folgt vor, um das Wörterbuch unter "Apple" zu speichern:
Und wenn Sie wissen, wie viele von ihnen Amerikaner sind (16), gehen Sie folgendermaßen vor:
quelle
.keys()
abrufen, um dynamisch darauf zugreifen zu können."n"
in unbekannter Tiefe in einem unbekannten Element gespeichert haben.Wenn die Fragen lauten: Wenn ich weiß, dass ich ein Diktat von Diktaten habe, das "Apfel" als Frucht und "Amerikaner" als Apfelsorte enthält, würde ich Folgendes verwenden:
wie andere vorgeschlagen haben. Wenn stattdessen die Frage lautet, ob Sie nicht wissen, ob "Apple" als Frucht und "Amerikaner" als eine Art "Apple" existieren, wenn Sie eine beliebige Datei in Ihr Diktat der Diktatdatenstruktur einlesen, können Sie Folgendes tun:
oder noch besser, damit Sie nicht unnötig über das gesamte Diktat von Diktaten iterieren, wenn Sie wissen, dass nur Apple den Typ Amerikaner hat:
In all diesen Fällen spielt es keine Rolle, in welcher Reihenfolge die Wörterbücher die Einträge tatsächlich speichern. Wenn Sie wirklich besorgt über die Bestellung sind, können Sie Folgendes in Betracht ziehen
OrderedDict
:http://docs.python.org/dev/library/collections.html#collections.OrderedDict
quelle
Wie ich bei Ihrer Beschreibung bemerkt habe, wissen Sie nur, dass Ihr Parser Ihnen ein Wörterbuch gibt, dessen Werte ebenfalls wie folgt lauten:
Sie müssen also über Ihr übergeordnetes Wörterbuch iterieren. Wenn Sie alle ersten Wörterbuchschlüssel in der
sampleDict.values()
Liste ausdrucken oder darauf zugreifen möchten , können Sie Folgendes verwenden:Wenn Sie nur auf den ersten Schlüssel des ersten Elements in zugreifen möchten
sampleDict.values()
, kann dies nützlich sein:Wenn Sie das Beispiel verwenden, das Sie in der Frage gegeben haben, meine ich:
Die Ausgabe für den ersten Code lautet:
Und die Ausgabe für den zweiten Code lautet:
quelle
Als Bonus möchte ich eine andere Lösung für Ihr Problem anbieten. Sie scheinen es mit verschachtelten Wörterbüchern zu tun zu haben, was normalerweise mühsam ist, insbesondere wenn Sie prüfen müssen, ob ein innerer Schlüssel vorhanden ist.
Es gibt einige interessante Bibliotheken zu diesem Thema auf pypi, hier ist eine schnelle Suche für Sie.
In Ihrem speziellen Fall scheint dict_digger geeignet zu sein.
quelle
Sie können
dict['Apple'].keys()[0]
den ersten Schlüssel imApple
Wörterbuch abrufen, es gibt jedoch keine Garantie dafürAmerican
. Die Reihenfolge der Schlüssel in einem Wörterbuch kann sich abhängig vom Inhalt des Wörterbuchs und der Reihenfolge ändern, in der die Schlüssel hinzugefügt wurden.quelle
OrderedDict
in dercollections
BibliothekIch weiß, dass dies 8 Jahre alt ist, aber niemand scheint die Frage tatsächlich gelesen und beantwortet zu haben.
Sie können .values () für ein Diktat aufrufen, um eine Liste der inneren Diktate abzurufen und somit über den Index darauf zuzugreifen.
quelle
'dict_values' object does not support indexing
. Vermutlich muss diese Antwort aktualisiert werden, da Sie dict_values umbrechen müssen, um eine Liste wiederherzustellenSie können sich nicht auf die Reihenfolge der Wörterbücher verlassen. Aber Sie können dies versuchen:
Wenn Sie möchten, dass die Reihenfolge erhalten bleibt, können Sie Folgendes verwenden: http://www.python.org/dev/peps/pep-0372/#ordered-dict-api
quelle
Einfaches Beispiel, um zu verstehen, wie auf Elemente im Wörterbuch zugegriffen wird: -
Erstellen Sie ein Wörterbuch
Erfahren Sie mehr über Python-Wörterbücher und lernen Sie hier interaktiv ...
quelle
Trotz der vielen Antworten auf diese Frage scheinen nur wenige Menschen darauf hingewiesen zu haben, dass Wörterbücher ungeordnete Zuordnungen sind, und so (bis zum Segen der Einfügereihenfolge mit Python 3.7) wurde die Idee des "ersten" Eintrags in einem Wörterbuch buchstäblich gemacht keinen Sinn. Und selbst auf einen
OrderedDict
kann nur über einen numerischen Index zugegriffen werden, wenn solche Hässlichkeiten wiemydict[mydict.keys()[0]]
(nur Python 2, da Python 3keys()
ein nicht abonnierbarer Iterator ist) verwendet werden.Ab 3.7 und in der Praxis auch in 3.6 - das neue Verhalten wurde dann eingeführt, aber erst ab 3.7 in die Sprachspezifikation aufgenommen - Iteration über die Schlüssel, Werte oder Elemente eines Diktats (und, glaube ich, a set also) liefert zuerst die zuletzt eingefügten Objekte. Es gibt immer noch keine einfache Möglichkeit, über einen numerischen Einfügeindex auf sie zuzugreifen.
Wenn Sie den Schlüssel kennen, den Sie im Wörterbuch abrufen möchten, verwenden Sie den Schlüssel normalerweise als Index, um ihn abzurufen (
my_var = mydict['Apple']
).Wenn Sie wirklich in der Lage sein möchten, die Elemente nach Eintragsnummer zu indizieren (ohne die Tatsache zu berücksichtigen, dass sich die Nummer eines bestimmten Eintrags beim Einfügen ändert), ist die entsprechende Struktur wahrscheinlich eine Liste von Tupeln mit zwei Elementen. Anstatt
Sie könnten verwenden:
Unter diesem Regime ist der erste Eintrag
mylist[0]
in klassischer Listen-endexierter Form und sein Wert ist('Apple', {'American':'16', 'Mexican':10, 'Chinese':5})
. Sie können die gesamte Liste wie folgt durchlaufen:Aber wenn Sie wissen, dass Sie nach dem Schlüssel "Apple" suchen, warum würden Sie nicht stattdessen einfach ein Diktat verwenden?
Sie könnten eine zusätzliche Indirektionsebene einführen, indem Sie die Liste der Schlüssel zwischenspeichern. Die Komplexität, zwei Datenstrukturen synchron zu halten, würde jedoch unweigerlich zur Komplexität Ihres Codes beitragen.
quelle
Mit der folgenden kleinen Funktion wird das Durchsuchen eines baumförmigen Wörterbuchs ganz einfach:
Kehrt jetzt
dig(mydict, "Apple.Mexican")
zurück10
, währenddig(mydict, "Grape")
der Teilbaum erhalten wird{'Arabian':'25','Indian':'20'}
. Wenn ein Schlüssel nicht im Wörterbuch enthalten ist, wirddig
zurückgegebenNone
.Beachten Sie, dass Sie das Trennzeichen von '.' Einfach ändern (oder sogar parametrisieren) können. zu '/', '|' etc.
quelle