bhaskarc
bhaskarc

Reputation: 9521

Python Sorted by Index

Lets say there is a dictionary

foo = {'b': 1,  'c':2,  'a':3 }

I want to iterate over this dictionary in the order of the appearance of items in the dictionary.

for k,v in foo.items():
    print k, v

prints

a 3
c 2
b 1

If we use sorted() function:

for k,v in sorted(foo.items()):
    print k, v

prints

a 3
b 1
c 2

But i need them in the order in which they appear in the dictionary i;e

b 1
c 2
a 3

How do i achieve this ?

Upvotes: 1

Views: 234

Answers (7)

Stephan
Stephan

Reputation: 17971

An ordered dictionary would have to be used to remember the order that they were stored in

>>>from collections import OrderedDict
>>>od = OrderedDict()
>>>od['b'] = 1
>>>od['c'] = 2
>>>od['a'] = 3
>>>print od
OrderedDict([('b',1), ('c',2), ('a',3)]

Upvotes: 2

Sukrit Kalra
Sukrit Kalra

Reputation: 34493

Dictionaries have no order. If you want to do that, you need to find some method of sorting in your original list. Or, save the keys in a list in the order they are saved and then access the dictionary using those as keys.

From The Python Docs

It is best to think of a dictionary as an unordered set of key: value pairs, with the requirement that the keys are unique (within one dictionary).

Example -

>>> testList = ['a', 'c', 'b']
>>> testDict = {'a' : 1, 'c' : 2, 'b' : 3}
>>> for elem in testList:
        print elem, testDict[elem]


a 1
c 2
b 3

Or better yet, use an OrderedDict -

>>> from collections import OrderedDict
>>> testDict = OrderedDict([('a', 1), ('c', 2), ('b', 3)])
>>> for key, value in testDict.items():
        print key, value


a 1
c 2
b 3

Upvotes: 11

roman
roman

Reputation: 117345

You can do this by one-liner:

>>> sorted(foo.items(), key=lambda x: x[1])
[('b', 1), ('c', 2), ('a', 3)]

Upvotes: 2

Matthew Graves
Matthew Graves

Reputation: 3284

If you just want to sort them by the keys do:

sorted_by_keys_dict = dict((y,x) for x,y in foo.iteritems())
for k,v in sorted(sorted_by_keys_dict.items()):
    print v, k

a 1
c 2
b 3

or simply:

for k,v in sorted(dict((y,x) for x,y in foo.iteritems()).items()):
    print v, k

a 1
c 2
b 3

Upvotes: 1

roblinton
roblinton

Reputation: 309

If you want to use your OrderedDict multiple times, use an OrderedDict like people have said. :) If you just want a one-liner for a one-off, change your sort function:

sorted(foo.items(), lambda a,b:a[1]-b[1])

Upvotes: 2

dansalmo
dansalmo

Reputation: 11686

The see this more directly, the order you used to create the dict is not the order of the dict. The order is indeterminate.

>>> {'b': 1,  'c':2,  'a':3 }
{'a': 3, 'c': 2, 'b': 1}

Upvotes: 1

nwalsh
nwalsh

Reputation: 471

Maybe this?

sorted(foo, key=foo.get)

Upvotes: 2

Related Questions