自然顺序排序字典键

9

我希望能够按照“自然顺序”对字典键进行排序。如果我有一个带有键的字典:

    d = {"key1" : object, "key11" : object, "key2" : object, "key22" : object", "jay1" : object, "jay2" : object}

我希望对这个字典进行排序,以得到以下结果:

    d = { "jay1" : object, "jay2" : object, "key_1" : object, "key_2" : object, "key_11" : object, "key_22" : object"}

1
请使用 https://docs.python.org/2/library/collections.html#collections.OrderedDict。 - marcadian
2
字典是无序的。您无法控制字典键的顺序。 - BrenBarn
你是在问如何“对字典进行排序”(如果是这样,那么这个问题就是重复的),还是如何按自然顺序排序(我很确定这也是一个重复的问题)? - Bakuriu
3
我不认为这是一个重复的问题,因为它被标记为重复的问题是关于标准排序,而这个问题是关于自然排序的。 - ThomasW
1
应该重新开放,因为它涉及到自然排序,这也是我在谷歌搜索时找到这个问题的原因。 - Cornelius Roemer
这不是与“如何按键排序字典”重复的问题,因为这个问题在标题和正文中明确指出是关于自然顺序的,并且给出了一个合适的例子。普通(默认)排序会以不同的方式重新排列键。 - undefined
4个回答

5
你可以将你的字典转化为 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')])

基本上,这里发生的事情是将字符串分成“字符串”部分和数字部分。 数字部分更改为int,并使用这两个值进行排序。


这不会按自然顺序对键进行排序。 - user2909250
@user2909250 抱歉,我修改了示例以包括缺失的“自然”顺序。 - Marcin
1
你可以使用 natsort.natsorted 来避免冗长的 lambda 和正则表达式。 - SethMMorton

2

正如其他人所说,字典是无序的。但是,如果您想按自然顺序遍历这些键,可以尝试以下方法:

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]

这不是自然顺序。自然顺序是当字符串 "key11" 在字符串 "key2" 之后。 - undefined

1

由于其顺序实际上是看似随意的(实际上并非如此),因此您无法对dictionaries进行排序。相反,您可以使用natsort.natsorted()items()进行排序:

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

这不会按自然顺序对键进行排序。 - user2909250
现在它可以了 :) - A.J. Uppal

0
在Python中,{'a': object, 'b': object}{'b': object, 'a': object}是完全相同的,因为字典是无序的。

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