2014-03-26 32 views
9

Ich habe ein bestelltes Wörterbuch und möchte die individuelle Reihenfolge ändern. Im folgenden Codebeispiel möchte ich Punkt 3 (Personen) zusammen mit seinen Werten auf Position 2 verschieben. Die Reihenfolge lautet also Tiere, Personen, Essen, Getränke. Wie gehe ich bei ihm vor?Ändern Reihenfolge der Reihenfolge Wörterbuch in Python

import collections 

queue = collections.OrderedDict() 

queue["animals"] = ["cat", "dog", "fish"] 
queue["food"] = ["cake", "cheese", "bread"] 
queue["people"] = ["john", "henry", "mike"] 
queue["drinks"] = ["water", "coke", "juice"] 

print queue 

Antwort

3

Edit: Sie können eine benutzerdefinierte Funktion schreiben (Warnung, dies funktioniert aber es ist sehr schnell und schmutzig):

EDIT: Fehler behoben, wenn Sie tritt vorwärts zu bewegen versuchen,

import collections 

def move_element(odict, thekey, newpos): 
    odict[thekey] = odict.pop(thekey) 
    i = 0 
    for key, value in odict.items(): 
     if key != thekey and i >= newpos: 
      odict[key] = odict.pop(key) 
     i += 1 
    return odict 

queue = collections.OrderedDict() 

queue["animals"] = ["cat", "dog", "fish"] 
queue["food"] = ["cake", "cheese", "bread"] 
queue["people"] = ["john", "henry", "mike"] 
queue["drinks"] = ["water", "coke", "juice"] 
queue["cars"] = ["astra", "focus", "fiesta"] 

print queue 

queue = move_element(queue, "people", 1) 

print queue 
+0

Ich mag diesen Ansatz, aber es funktioniert nicht, wenn Sie versuchen, "Leute" auf Position 4 zu verschieben, senden Sie Move-Element 3. – speedyrazor

+0

Richtig ... Ich habe meine Antwort bearbeitet, um zu prüfen Randbedingung. – Selcuk

+0

Wenn ich weitere Elemente zur Warteschlange hinzufüge, bricht es dann wieder mit 3. – speedyrazor

8

OrderedDicts werden von insertion order bestellt. Sie müssten also ein neues OrderedDict konstruieren, indem Sie die key:value Paare im ursprünglichen Objekt durchlaufen. Es gibt keine OrderedDict Methode, die Ihnen helfen wird.

Sie könnten also eine tuple erstellen, um die Ideenreihenfolge der keys darzustellen, und dann iterieren, um eine neue zu erstellen.

key_order = ('animal', 'people', 'food', 'drink') 
new_queue = OrderedDict() 
for k in key_order: 
    new_queue[key] = queue[key] 

Oder eloquenter

OrderedDict((k, queue[k]) for k in key_order) 
+0

Es zeigt an, dass der Namensschlüssel nicht definiert ist. –

+0

@AbhishekBhatia - behoben den Tippfehler – geographika

1

Ich glaube, Sie werden es manuell zu tun haben:

>>> keys = list(queue) 
>>> keys 
['animals', 'food', 'people', 'drinks'] 
>>> keys[1], keys[2] = keys[2], keys[1] 
>>> queue = collections.OrderedDict((key, queue[key]) for key in keys) 
>>> list(queue) 
['animals', 'people', 'food', 'drinks'] 
0

Siehe this question.

Das glaube ich nicht, dass Sie das sortieren Wörterbuch wie Sie hoffen, ohne den Auftrag explizit neu zu definieren.

Verwandte Themen