This question already has answers here:
Closed 5 years ago.
I want to sort dictionary keys in a "natural order". If I have a dictionary with the keys
d = {"key1" : object, "key11" : object, "key2" : object, "key22" : object", "jay1" : object, "jay2" : object}
I want to sort this dictionary so the result is:
d = { "jay1" : object, "jay2" : object, "key_1" : object, "key_2" : object, "key_11" : object, "key_22" : object"}
You can change your dict into OrderedDict:
import collections, re
d = {"key1" : 'object', "key11" : 'object', "key2" : 'object', "key22" : 'object', "jay1" : 'object', "jay2" : 'object'}
my_fun = lambda k,v: [k, int(v)]
d2 = collections.OrderedDict(sorted(d.items(), key=lambda t: my_fun(*re.match(r'([a-zA-Z]+)(\d+)',t[0]).groups())))
print(d2)
#reslt: OrderedDict([('jay1', 'object'), ('jay2', 'object'), ('key1', 'object'), ('key11', 'object'), ('key2', 'object'), ('key22', 'object')])
Basically, what is happening here, that I split the strings into 'string' part and number part. Number part is changed to int
, and the sorting happens using these two values.
As others have said, dictionaries are not ordered. However, if you want to iterate through these keys in a natural order, you could do something like the following:
d = {"key1" : object, "key11" : object, "key2" : object, "key22" : object, "jay1" : object, "jay2" : object}
sortedKeys = sorted(d.keys())
print sortedKeys
for key in sortedKeys:
print d[key]
In Python, {'a': object, 'b': object}
is exactly the same as {'b': object, 'a': object}
because dictionaries are not ordered.
You can't order dictionaries
because their order is seemingly arbitrary (it's actually not). Instead, you can sort the items()
using natsort.natsorted()
:
d = {"key1" : object, "key11" : object, "key2" : object, "key22" : object, "jay1" : object, "jay2" : object}
print natsort.natsorted(d.items()) #[('jay1', <type 'object'>), ('jay2', <type 'object'>), ('key1', <type 'object'>), ('key2', <type 'object'>), ('key11', <type 'object'>), ('key22', <type 'object'>)]