使用自然顺序的字母数字键对字典进行排序

时间:2017-09-11 08:19:34

标签: python sorting dictionary

我有一个python字典:

d = {'a1': 123, 'a2': 2, 'a10': 333, 'a11': 4456}

当我使用OrderedDict对字典进行排序时,我得到以下输出:

from collections import OrderedDict
OrderedDict(sorted(d.items()))
# Output
# OrderedDict([('a1', 123), ('a10', 333), ('a11', 4456), ('a2', 2)])

有没有办法按照自然顺序得到它:

OrderedDict([('a1', 123), ('a2', 2), ('a10', 333), ('a11', 4456)])
or 
{'a1': 123, 'a2': 2, 'a10': 333, 'a11': 4456}

感谢。

2 个答案:

答案 0 :(得分:5)

您很幸运:natsort模块可以提供帮助。首先,使用以下命令安装:

pip install natsort

现在,您可以将d.keys()传递给natsort.natsorted,然后构建新的OrderedDict

import natsort
from collections import OrderedDict

d = {'a1' : 123, 
     'a2' : 2, 
     'a10': 333, 
     'a11': 4456}
keys = natsort.natsorted(d.keys())    
d_new = OrderedDict((k, d[k]) for k in keys)

较短的版本涉及排序d.items()RomanPerekhrest's answer获得此想法):

d_new = OrderedDict(natsort.natsorted(d.items()))
d_new
OrderedDict([('a1', 123), ('a2', 2), ('a10', 333), ('a11', 4456)])

答案 1 :(得分:0)

在字符代码上使用chr()函数的短“技巧”(无外部包):

import collections

d = {'a1': 123, 'a2': 2, 'a10': 333, 'a11': 4456}
result = collections.OrderedDict(sorted(d.items(), key=lambda x: chr(int(x[0][1:]))))
print(result)

输出:

OrderedDict([('a1', 123), ('a2', 2), ('a10', 333), ('a11', 4456)])