Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Changing order of ordered dictionary in python

I have an ordered dictionary and want to change the individual order. In the below code example I want to item 3 (people), along with its values, to move to position 2. So the order will be animals, people, food, drinks. How do I go about his?

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
like image 467
speedyrazor Avatar asked Mar 26 '14 14:03

speedyrazor


2 Answers

OrderedDicts are ordered by insertion order. So you would have to construct a new OrderedDict by looping over the key:value pairs in the original object. There is no OrderedDict method that will help you.

So you could create a tuple to represent the idea order of the keys, and then iterate over that to create a new OrderedDict.

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

Or more eloquently

OrderedDict((k, queue[k]) for k in key_order)
like image 144
dannymilsom Avatar answered Oct 21 '22 07:10

dannymilsom


Edit: You can write a custom function (warning, this works but is very quick and dirty):

EDIT: Fixed bug that occurs when you try to move forward

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
like image 42
Selcuk Avatar answered Oct 21 '22 07:10

Selcuk