Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/316.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何按键对dict进行排序?_Python_Sorting_Dictionary_Key_Sorted - Fatal编程技术网

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]”访问通道中的值