So I have a dictionary that looks like this when I print it:
{'10': -10, 'ZT21': 14, 'WX21': 12, '2': 15, '5': -3, 'UM': -25}
I want to sort these in a custom manner, which I define. Let's say the way I want it to be sorted (by key) is ZT21, 10, WX21, UM, 5, 2
.
Anyone know how to go about sorting out a dictionary in a predefined/custom manner? What I am doing is getting this dictionary from a database, and it can come out with over 20 keys, all of which have a specific order. The order is always set, but sometimes certain keys/values wouldn't be in the dictionary. So this could happen too:
{'ZT21': 14, 'WX21': 12, '2': 15, '5': -3, 'UM': -25}
sorted (by key) is ZT21, 10, WX21, UM, 5, 2
.
So the 10 isn't there in this example, but the sorting I need is still the same, the 10 would just be absent.
Any ideas?
Updated answer for Python 3.6+
>>> d = {'10': -10, 'ZT21': 14, 'WX21': 12, '2': 15, '5': -3, 'UM': -25}
>>> keyorder = ['ZT21', '10', 'WX21', 'UM', '5', '2']
>>> {k: d[k] for k in keyorder if k in d}
{'ZT21': 14, '10': -10, 'WX21': 12, 'UM': -25, '5': -3, '2': 15}
Legacy answer:
Dictionaries in Python are unordered (before Python3.6). You can get the results you need as a list
>>> d = {'10': -10, 'ZT21': 14, 'WX21': 12, '2': 15, '5': -3, 'UM': -25}
>>> keyorder = ['ZT21', '10', 'WX21', 'UM', '5', '2']
>>> sorted(d.items(), key=lambda i:keyorder.index(i[0]))
[('ZT21', 14), ('10', -10), ('WX21', 12), ('UM', -25), ('5', -3), ('2', 15)]
or as an OrderedDict
>>> from collections import OrderedDict
>>> OrderedDict(sorted(d.items(), key=lambda i:keyorder.index(i[0])))
OrderedDict([('ZT21', 14), ('10', -10), ('WX21', 12), ('UM', -25), ('5', -3), ('2', 15)])
If you are doing a lot of these, it will be more efficient to use a dict
for the keyorder
>>> keyorder = {k:v for v,k in enumerate(['ZT21', '10', 'WX21', 'UM', '5', '2'])}
>>> OrderedDict(sorted(d.items(), key=lambda i:keyorder.get(i[0])))
OrderedDict([('ZT21', 14), ('10', -10), ('WX21', 12), ('UM', -25), ('5', -3), ('2', 15)])
You can sort it using OrderedDict and by specifying your Custom-order.
def customsort(dict1 , key_order):
items = [dict1[k] if k in dict1.keys() else 0 for k in key_order]
sorted_dict = OrderedDict()
for i in range(len(key_order)):
sorted_dict[key_order[i]] = items[i]
return sorted_dict
key_order = [ "monday" ,"tuesday" ,"wednesday" ,"thursday" ,"friday" ,"saturday"]
dict1 ={"monday" : 10 , "thursday" :12 , "wednesday" : 34}
sorted_dicti = customsort(dict1,key_order)
print(sorted_dicti)
customsort() sorts given dictionary(dict1) by order(key_order) passed by user.
items = [dict1[k] if k in dict1.keys() else 0 for k in key_order]
It will check if the given key is in dict1 if it is there then put value specified in dict1 else put value as 0.
OrderedDict([('monday', 10), ('tuesday', 0), ('wednesday', 34), ('thursday', 12), ('friday', 0), ('saturday', 0)])
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With