使用自然顺序排列字母数字键的字典排序

3

I have a python dictionary:

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个回答

9

你很幸运: 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 的答案):
d_new = OrderedDict(natsort.natsorted(d.items()))

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

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)])

但当键是'aa11'时,这将导致错误。 - undefined
@Jeril,你没有提到输入可以是任意的。这个方法适用于你当前的输入格式。 - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接