2013-09-26 5 views
8

Vor dem Posten habe ich schon Access an arbitrary element in a dictionary in Python durchgemacht, aber ich bin mir nicht sicher.Wie auf die ersten und letzten Elemente in einem Wörterbuch Python zuzugreifen?

Ich habe ein langes Wörterbuch und ich muss die Werte seiner ersten und letzten Schlüssel erhalten. Ich kann dict[dict.keys()[0]] und dict[dict.keys()[-1]] verwenden, um die ersten und letzten Elemente zu erhalten, aber da die Schlüssel: Wert-Paare in zufälliger Form ausgegeben werden (wie in der Positionierung des Schlüssels: Wertpaare sind zufällig), wird die Lösung in dieser Verbindung immer zur Verfügung gestellt Arbeit?

Antwort

16

Verwenden Sie eine OrderedDict, da ein normales Wörterbuch die Reihenfolge der Elemente nicht beibehält, wenn sie es durchlaufen.Hier ist, wie:

# import the right class 
from collections import OrderedDict 

# create and fill the dictionary 
d = OrderedDict() 
d['first'] = 1 
d['second'] = 2 
d['third'] = 3 

# retrieve key/value pairs 
els = list(d.items()) # explicitly convert to a list, in case it's Python 3.x 

# get first inserted element 
els[0] 
=> ('first', 1) 

# get last inserted element 
els[-1] 
=> ('third', 3) 
+2

Ab Python 3.6 ist OrderDict() nicht mehr erforderlich, da die aktuelle native Wörterbuchimplementierung die Reihenfolge der Einfügungen beibehält. –

+0

@juanIsaza Können Sie bitte einen Proof Link zur Verfügung stellen ?! – TechJS

+0

Gibt es eine Möglichkeit, dies zu tun, ohne den gesamten Wörterbuchinhalt in eine Liste kopieren zu müssen? So etwas wie d.front() und d.back()? – Mattia

1

Python-Wörterbücher sind ungeordnet, daher ist "first" und "last" nicht definiert. Stattdessen können Sie Ihre Schlüssel sortieren und dann auf das Element zugreifen, das mit dem ersten und letzten Schlüssel in Ihrer sortierten Menge verknüpft ist.

EDIT:

Die OP stellte klar, dass durch „ersten“ und „letzten“ er den Befehl verstanden, in dem Schlüssel zu dem Wörterbuch hinzugefügt wurde. collections.OrderedDict sollte für diesen Fall funktionieren.

+0

Das ist was ich gesagt habe. Gibt es dafür eine Lösung? – PythonEnthusiast

+0

@ user1162512 Ich habe einen Vorschlag zum Sortieren der Schlüssel hinzugefügt, aber das ist das Beste, was Sie tun können. –

+0

Was passiert, wenn ich mein Wörterbuch als 'dict = {" xyz ": 294," a ": 1," rah ": 129}' speichere? Auf welcher Grundlage würde ich die Schlüssel sortieren, um den Zugang von xyz und rah zu bekommen. – PythonEnthusiast

1

Es gibt keine "ersten" oder "letzten" Schlüssel im Wörterbuch, die keine bestimmte Reihenfolge garantieren. So gibt es keine Möglichkeit, "erste" oder "letzte" Element zu erhalten. Sie können nur Ihren eigenen Wrapper um Python dict erstellen, die die Informationen über „ersten“ gespeichert werden und „letzte“ Objekt

So etwas wie

class MyDict: 

    def __init__(self): 
    self.first=None 
    self.last=None 
    self.dict={} 

    def add(key, value): 
    if self.first==None: self.first=key 
    self.last=key 
    self.dict[key]=value 

    def get(key): 
    return self.dict[key] 

    def first(): 
    return self.dict[ self.first ] 

    def last(): 
    return self.dict[ self.last ] 

Obwohl, wie es in dem Kommentar darauf hingewiesen, gibt es bereits OrderedDict eine Klasse: http://docs.python.org/2/library/collections.html#collections.OrderedDict

bestellten Wörterbücher sind wie normale Wörterbücher, aber sie erinnern die Ordnung, die Elemente eingefügt wurden. Beim Iterieren über ein geordnetes Wörterbuch werden die Elemente in der Reihenfolge zurückgegeben, in der ihre Schlüssel zuerst hinzugefügt wurden.

+4

Oder verwenden Sie '' collections.OrderedDict'', wenn die Definition von "first" und "last" mit OPs übereinstimmt. – fjarri

+0

Und wie werde ich einen Wrapper erstellen? Irgendeine Demo? – PythonEnthusiast

0

CPython Implementierung Detail: Schlüssel und Werte werden in einer beliebigen Reihenfolge aufgelistet, die nicht zufällig ist, variiert über Python-Implementierungen, und ist abhängig von der Geschichte von Einfügungen und Löschungen von Wörterbuch. - dict documentation

jedoch empfehle ich Reihenfolge der Elemente in associative array Datenstruktur hoch nicht zu verlassen (dict einer von ihnen ist), da häufig es keine einzige offensichtliche Möglichkeit ist Schlüssel zu bestellen. Zum Beispiel in Python "21" < "3" während 21 > 3.

0

def dictionarySortingExample (Yourdictionary):

#get all the keys and store them to a list 
allKeys = yourDictionary.keys() 

#sort the list of keys 
allKeysSorted = sorted(allKeys) 

#retrieve the first and last keys in the list 
firstKey = allKeysSorted[0] 
lastKey = allKeysSorted[-1] 

#retrive the values from the dictionary 
firstValue = yourDictionary[firstKey] 
lastValue = yourDictionary[lastKey] 

print "---Sorted Dictionary---" 
print "original dictionary: " + str(yourDictionary) 
print "list of all keys: " + str(allKeys) 
print "ordered list of all keys: " + str(allKeysSorted) 
print "first item in sorted dictionary: " + str(firstKey) + ":" + str(firstValue) 
print "last item in sorted dictionary: " + str(lastKey) + ":" + str(lastValue) 

Beispiel Wörterbuch Sortierung

sampleDictionary = {4: "vier", "Cranberry": 2, 3: "drei" , 2: "zwei", "Apple": 3, 1: "one", "Bananna": 1} dictionarySortingExample (sampleDictionary)

0

Wenn mit Python arbeiten 3.6+ Sie ein Motto tun können:

Erstens:

list({'fist': 1, 'second': 2, 'last': 3}.items())[0] 
=> ('first', 1) 

Last:

list({'fist': 1, 'second': 2, 'third': 3}.items())[-1] 
=> ('third', 1) 

Dies ist der Fall, weil Python 3.6 oder höher Standard-Wörterbuch Auftrag erhält.

Verwandte Themen