How to make a dictionary retain its sort order?

1.8k views Asked by At
def positive(self):
    total = {}
    final = {}
    for word in envir:
        for i in self.lst:
            if word in i:
                if word in total:
                    total[word] += 1
                else:
                    total[word] = 1
    final = sorted(total, reverse = True)

    return total

This returns

{'climate': 10, 'ecosystem': 1, 'energy': 6, 'human': 1, 'world': 2, 'renewable': 2, 'native': 2}

I want to get this dictionary back to a dictionary that is in order. How do you I sort it and return a dictionary?

2

There are 2 answers

1
Tatsh On

Dictionaries in Python have no explicit order (except in 3.6). There is no property of 'order' in a hash table. To preserve order in Python, use a list of tuples:

unordered = (('climate', 10,), ('ecosystem', 1)) # etc

Calling sorted(unordered) on the above will give it back with the 'key' being the first item in each individual tuple. You do not need to provide any other arguments to sorted() in this case.

To iterate, use for x, y in z: where z is the list.

0
Ébe Isaac On

An ordered dictionary would get you what you need

from collections import OrderedDict

If you want to order your items in lexicographic order, then do the following

d1 = {'climate': 10, 'ecosystem': 1, 'energy': 6, 'human': 1, 'world': 2, 'renewable': 2, 'native': 2}
od = OrderedDict(sorted(d1.items(), key=lambda t: t[0]))

Contents of od:

OrderedDict([('climate', 10),
             ('ecosystem', 1),
             ('energy', 6),
             ('human', 1),
             ('native', 2),
             ('renewable', 2),
             ('world', 2)])

If you want to specify exactly which order you want your dictionary, then store them as tuples and store them in that order.

t1 = [('climate',10), ('ecosystem', 1), ('energy',6), ('human', 1), ('world', 2), ('renewable', 2), ('native', 2)]
od = OrderedDict()

for (key, value) in t1:
    od[key] = value 

od is now

OrderedDict([('climate', 10),
             ('ecosystem', 1),
             ('energy', 6),
             ('human', 1),
             ('world', 2),
             ('renewable', 2),
             ('native', 2)])

In use, it is just like a normal dictionary, but with its internal contents' order specified.