In this article we will explore different methods to sort dictionary by key in Python programming. But before that, you should be aware that as of Python 3.6, now dictionary can remember the order of insertion of items unlike older versions of Python.
The order-preserving aspect of this new implementation is considered an implementation detail and should not be relied upon (this may change in the future, but it is desired to have this new dict implementation in the language for a few releases before changing the language spec to mandate order-preserving semantics for all current and future Python implementations; this also helps preserve backwards-compatibility with older versions of the language where random iteration order is still in effect, e.g. Python 3.5).
Performing list(d) on a dictionary returns a list of all the keys used in the dictionary, in insertion order (if you want it sorted, just use sorted(d) instead).
Method-1: Python sort dictionary by key using for loop with sorted()
In this example we will sort the dictionary items based on key and then store it in a new dictionary. This method will work on any version of Python, although for long dictionaries, this method can be performance intensive.
Here we will use sorted()
to sort the dictionary based on keys and store it in a variable and then we will run a nested for loop to match the sorted keys to create our new dictionary.
#!/usr/bin/env python3 mydict_1 = {'key5': 'value5', 'key3': 'value3', 'key1': 'value1', 'key2': 'value2'} # Create new dictionary new_dict = {} # sort the keys and store them in a new variable sorted_value = sorted(mydict_1.keys()) # for all the values in sorted_value for i in sorted_value: # match the key element with un-sorted dictionary for key, value in mydict_1.items(): if key == i: # when matched place the key and value in the new dict new_dict[key] = value print(new_dict)
Output from this script:
Method-2: Python sort dictionary by key using sorted()
with lambda
The lambda statement in Python is simply an anonymous function. Due to the syntax, it is slightly more limited than regular functions, but a lot can be done through it. Here, the dictionary returns the (key, value) pair. The lambda function makes key = value
, thus the ordered dictionary will be sorted by its key.
#!/usr/bin/env python3 mydict = {'key5': 'value4', 'key3': 'value2', 'key1': 'value5', 'key2': 'value1'} print('Without sort: ', mydict) # Sort based on item[0] i.e. key in the dictionary sorted_mydict = dict(sorted(mydict.items(), key=lambda item: item[0])) print('After sort: ', sorted_mydict) # Check type of the new dictionary print(type(sorted_mydict))
Output from this script:
Method-3: Python sort dictionary by key using for loop with sorted()
and lambda
This method is similar to method-2 we used above with one difference, here we will use for loop to iterate over the key value pair and create our sorted dictionary. In the previous example we had to use dict()
to convert the list into dictionary but here with for loop we don't have to worry about that.
#!/usr/bin/env python3 mydict = {'key5': 'value4', 'key3': 'value2', 'key1': 'value5', 'key2': 'value1'} # Empty dictionary to store the sorted items new_dict = {} print('Without sort: ', mydict) # This will sort the dictionary by key of each entry # within the dictionary from smallest to largest for key, value in sorted(mydict.items(), key=lambda item: item[0]): # store the sorted items in new dictionary new_dict[key] = value print('After sort: ', new_dict) print(type(new_dict))
Output from this script:
Method-4: Python sort dictionary by key using itemgetter()
Instead of lambda function there's a version available in the operator module named itemgetter()
. These are higher-order functions. The expression itemgetter(0)
creates a function. We can then apply the function to a collection to select an object, like this.
>>> from operator import itemgetter >>> itemgetter(0)([1, 2, 3]) 1
Let's use this in our example to sort dictionary by key:
#!/usr/bin/env python3 from operator import itemgetter mydict = {'key5': 'value4', 'key3': 'value2', 'key1': 'value5', 'key2': 'value1'} print('Without sort: ', mydict) sorted_mydict = dict(sorted(mydict.items(), key=itemgetter(0))) print('After sort: ', sorted_mydict) print(type(sorted_mydict))
Output from this script:
Method-5: Python sort dictionary by key using sorted()
with zip()
We can use sorted()
to sort the dictionary keys and values individually and later zip will make an iterator that aggregates elements from each of the iterables. Since zip()
returns an iterator of tuples so we use dict()
to convert it to dictionary type.
#!/usr/bin/env python3 mydict = {'key5': 'value4', 'key3': 'value2', 'key1': 'value5', 'key2': 'value1'} print('Without sort: ', mydict) # create (value, key) pairs using zip() sorted_mydict = dict(sorted(zip(mydict.keys(), mydict.values()))) print('After sort: ', sorted_mydict) print(type(sorted_mydict))
Output from this script:
Method-6: Python sort dictionary by key using sorted()
with get()
In this example we will use dict.get(key[, default])
along with sorted()
to sort dictionary by key. Here, dict.get(key[, default])
returns the value for key if the key exists; if the key doesn't exist, the optional default value is returned. If default is not defined, then None
is returned; this prevents an error from being generated.
Since this method returns value of a key, we use reverse=True
to sort based on key of the dictionary.
#!/usr/bin/env python3 mydict = {'key5': 'value4', 'key3': 'value2', 'key1': 'value5', 'key2': 'value1'} new_dict = {} print('Without sort: ', mydict) # sort dictionary keys using sorted() sorted_keys = sorted(mydict, key=mydict.get, reverse=True) # map the sorted keys with values from original dictionary for word in sorted_keys: new_dict[word] = mydict[word] print('After sort: ', new_dict) print(type(new_dict))
Output from this script:
Method-7: Python sort dictionary by key using sorted()
This is a very simple example where we use sorted to sort the dictionary elements based on it's key and then use for loop to print both key and it's mapping value pair:
#!/usr/bin/env python3 import collections mydict = {'key5': 'value4', 'key3': 'value2', 'key1': 'value5', 'key2': 'value1'} print('Without sort: ', mydict) for key in sorted(mydict.keys()): print(key, ":", mydict[key])
Output from this script:
Method-8: Python sort dictionary by key using JSON
JavaScript Object Notation (JSON) is a standard way of representing simple objects, such as lists and dicts, in the form of text strings. Although, it was originally developed for JavaScript, JSON is language independent and most languages can work with it.
We use the json.dumps()
function for converting an object to a JSON string. If sort_keys
is true (default: False), then the output of dictionaries will be sorted by key.
#!/usr/bin/env python3 import json mydict = {'key5': 'value4', 'key3': 'value2', 'key1': 'value5', 'key2': 'value1'} print('Without sort: ', mydict) print(json.dumps(mydict, sort_keys = True))
Output from this script:
Method-9: Sort dictionary by key in python using pprint
The pprint module provides a capability to “pretty-print” arbitrary Python data structures in a form which can be used as input to the interpreter. The pprint
module defines one class:
class pprint.PrettyPrinter(indent=1, width=80, depth=None, stream=None, *, compact=False, sort_dicts=True)
If sort_dicts=true
(the default), dictionaries will be formatted with their keys sorted, otherwise they will display in insertion order.
#!/usr/bin/env python3 import pprint mydict = {'key5': 'value4', 'key3': 'value2', 'key1': 'value5', 'key2': 'value1'} print('Without sort: ', mydict) print('After sort: ', end =' ') pprint.pprint(mydict)
Output from this script:
Method-10: Python sort dictionary by key using pandas
module
Pandas introduces two new data types to Python: Series
and DataFrame
. The DataFrame represents your entire spreadsheet or rectangular data, whereas the Series is a single column of the DataFrame. A Pandas DataFrame can also be thought of as a dictionary or collection of Series objects.
This column-less row of values is the index label of the dataframe. Think of the index label as being like a column name, but for rows instead of columns. By default, Pandas will fill in the index labels with the row numbers (note that it starts counting from 0).
#!/usr/bin/env python3 import pandas as pd mydict = {'key5': 'value4', 'key3': 'value2', 'key1': 'value5', 'key2': 'value1'} df=pd.DataFrame(mydict,index=[0]).sort_index(axis=1) print(df)
Output:
~]# python3 example-10.py
key1 key2 key3 key5
0 value5 value1 value2 value4
Use the .to_dict
method to generate dictionaries.
#!/usr/bin/env python3 import pandas as pd mydict = {'key5': 'value4', 'key3': 'value2', 'key1': 'value5', 'key2': 'value1'} print('Without sort: ', mydict) df=pd.DataFrame(mydict,index=[0]).sort_index(axis=1) #print(df) print('Ater sort', df.to_dict('int')[0])
Output from this script:
Summary
In this Python programming tutorial we learned about different methods to sort dictionary by key. You must make sure that the chosen method is supported on your version of Python as before Python 3.6, a dictionary was unordered and was not capable to remember the order of items inserted and we had to rely on OrderedDictionary
. But with Python 3.6 we can directly use dictionary as it can now remember the insertion order.