如何按键对字典中的字典排序?
我有一个字典,长得像这样:
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)