Python 如何按键对dict进行排序?
我有一个口述,看起来像:Python 如何按键对dict进行排序?,python,sorting,dictionary,key,sorted,Python,Sorting,Dictionary,Key,Sorted,我有一个口述,看起来像: 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':
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'},
}
我读过一些文章,但我不知道如何按主目录的键排序。a
dict
是一个映射,键没有顺序。这是由于dict()
类型的实现方式:对键进行散列(使用hash()
内置函数),您观察的顺序由此散列派生
您将需要一个有序的dict,以便字典保持其顺序,并允许您对键进行排序。该类型是Python3.x的内置有序dict
以下是对数据进行排序的示例:
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)
口述未排序/排序。如果您使用的是Python2.7,则可以使用OrderedDict。标准dict未排序。但是,您可以按排序顺序迭代其键和值:
for channelName, channelValue in sorted(channels.items()):
...
dict的键没有顺序,顺序是不能保证的。如果要创建词典列表,则会丢失密钥信息 如果需要排序迭代,可以使用
for key in sorted(dict):
....
口述是未分类的。但是,如果您想以所描述的方式进行迭代,可以按如下方式进行:
for key in sorted(channels):
print key
结果:
20
21
22
23
24
26
27
或者使用collections.OrderedDict。尝试以下方法:
result=collections.OrderedDict(sorted(your_dict.items()))
print [ {i: channels[i] } for i in sorted(channels)]
无法对
dict
进行排序。其项以“随机”顺序存储(取决于dict的实现)。因此,您必须使用集合。OrderedDict
而不是lambda x:x[0]
您可以使用操作符。itemgetter(0)
@ThiefMaster:我为什么要使用更多导入?这个怎么样?在任何情况下,lambda都不是必需的,所以我删除了它。itemgetter
版本更快。为什么你不想要更多的导入?导入之前我没有,我想看到不同的变体。这只是键,但我想有排序键和值。我的想法是,你可以通过“channels[key]”访问通道中的值