Pytanie Zmiana kolejności uporządkowanego słownika w pythonie


Mam zamówiony słownik i chcę zmienić indywidualne zamówienie. W poniższym przykładzie kodu chcę, aby pozycja 3 (ludzie), wraz z jej wartościami, przesunęła się do pozycji 2. Tak więc kolejność będą zwierzęta, ludzie, jedzenie, napoje. Jak mam się z nim obchodzić?

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

10
2018-03-26 14:24


pochodzenie




Odpowiedzi:


Edycja: Możesz napisać funkcję niestandardową (ostrzeżenie, działa, ale jest bardzo szybkie i brudne):

EDYCJA: Naprawiono błąd występujący przy próbie przejścia do przodu

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

4
2018-03-26 14:40





OrderedDicts są zamawiane przez zamówienie reklamowe. Musiałbyś więc skonstruować nowy OrderedDict, wykonując pętlę nad key:value pary w oryginalnym obiekcie. Nie ma OrderedDict metoda, która ci pomoże.

Więc możesz stworzyć tuple reprezentować kolejność pomysłów keys, a następnie wykonaj iterację, aby utworzyć nowy OrderedDict.

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

Lub bardziej elokwentnie

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

11
2018-03-26 14:32



Pokazuje klucz nazwy nie jest zdefiniowany. - Abhishek Bhatia
@ AbhishekBhatia - naprawiono literówkę - geographika


Myślę, że musisz to zrobić ręcznie:

>>> 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']

1
2018-03-26 14:33





Widzieć to pytanie.

Nie sądzę, żebyś mógł posortować słownik tak, jak masz nadzieję bez wyraźnego przedefiniowania zamówienia.


0
2018-03-26 14:34