如何按键对字典中的字典排序?

2 投票
7 回答
1346 浏览
提问于 2025-04-17 00:38

我有一个字典,长得像这样:

channels = {
'24': {'type': 'plain', 'table_name': 'channel.items.AuctionChannel'}, 
'26': {'type': 'plain', 'table_name': 'channel.gm.DeleteAvatarChannel'}, 
'27': {'type': 'plain', 'table_name': 'channel.gm.AvatarMoneyChannel'}, 
'20': {'type': 'plain', 'table_name': 'channel.gm.AvatarMoneyAssertChannel'}, 
'21': {'type': 'plain', 'table_name': 'channel.gm.AvatarKillMobComplexChannel'}, 
'22': {'type': 'plain', 'table_name': 'channel.gm.DistributionMarkChannel'}, 
'23': {'type': 'plain', 'table_name': 'channel.gm.MailChannel'}
}

我想按照键来排序(比如'24'、'26'、'27'等等),排序后应该是这样:

channels = {
'20': {'type': 'plain', 'table_name': 'channel.gm.AvatarMoneyAssertChannel'}, 
'21': {'type': 'merged', 'table_name': 'channel.gm.AvatarKillMobComplexChannel'}, 
'22': {'type': 'plain', 'table_name': 'channel.gm.DistributionMarkChannel'}, 
'23': {'type': 'plain', 'table_name': 'channel.gm.MailChannel'}
'24': {'type': 'merged', 'table_name': 'channel.items.AuctionChannel'}, 
'26': {'type': 'plain', 'table_name': 'channel.gm.DeleteAvatarChannel'}, 
'27': {'type': 'plain', 'table_name': 'channel.gm.AvatarMoneyChannel'}, 
}

我看过一些文章,但我还是不明白怎么按照主字典的键来排序。

7 个回答

5

标准的字典(dict)是没有顺序的。不过,你可以按照排序的顺序来遍历它的键和值:

for channelName, channelValue in sorted(channels.items()):
    ...
6

字典(Dicts)是没有顺序的,也就是说里面的元素是乱序的。如果你在用Python 2.7的话,可以使用OrderedDict,它可以保持元素的顺序。

2

一个 dict(字典)是用来存储键值对的,但它的键是没有顺序的。这是因为 dict() 这种类型的实现方式:键会被哈希(也就是用 hash() 这个内置函数处理),你看到的顺序是由这个哈希决定的。

如果你想让字典保持顺序,并且能够对键进行排序,你需要使用有序字典。Python 3.x 中的内置有序字典类型是 collections.OrderedDict

下面是一个对数据进行排序的例子:

import collections

channels = {
'24': {'type': 'plain', 'table_name': 'channel.items.AuctionChannel'}, 
'26': {'type': 'plain', 'table_name': 'channel.gm.DeleteAvatarChannel'}, 
'27': {'type': 'plain', 'table_name': 'channel.gm.AvatarMoneyChannel'}, 
'20': {'type': 'plain', 'table_name': 'channel.gm.AvatarMoneyAssertChannel'}, 
'21': {'type': 'plain', 'table_name': 'channel.gm.AvatarKillMobComplexChannel'}, 
'22': {'type': 'plain', 'table_name': 'channel.gm.DistributionMarkChannel'}, 
'23': {'type': 'plain', 'table_name': 'channel.gm.MailChannel'}
}

channels = collection.OrderedDict(sorted(channels.items(), key=lambda item: item[0]))
for key,value in channels.items():
    print(key, ':', value)

撰写回答