Как отсортировать диктанты по ключам? - PullRequest
2 голосов
/ 30 августа 2011

У меня есть диктат, который выглядит так:

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 ]

6 голосов
/ 30 августа 2011

Dicts не отсортированы / упорядочены. Если вы используете Python 2.7, вы можете использовать OrderedDict.

5 голосов
/ 30 августа 2011

Стандартный dict не отсортирован.Однако вы можете перебирать его ключи и значения в отсортированном порядке:

for channelName, channelValue in sorted(channels.items()):
    ...
2 голосов
/ 30 августа 2011

a dict - это отображение, ключи не упорядочены.это связано с тем, как реализован тип dict(): ключи хэшируются (с использованием встроенной функции hash()), и порядок, который вы наблюдаете, вытекает из этого хэша.

вам понадобится заказанный dictсловарь, чтобы сохранить его порядок и позволить вам сортировать ключи.тип collections.OrderedDict - это встроенный упорядоченный dict для python 3.x.

Вот пример сортировки ваших данных:

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)
1 голос
/ 30 августа 2011

Диктовка не отсортирована. Но если вы хотите выполнить итерацию описанным способом, вы можете сделать это следующим образом:

for key in sorted(channels):
    print key

Результат:

20
21
22
23
24
26
27

Или используйте collection.OrderedDict.

0 голосов
/ 30 августа 2011

попробуйте что-то вроде:

print [ {i: channels[i] } for  i in sorted(channels)]
0 голосов
/ 30 августа 2011
result=collections.OrderedDict(sorted(your_dict.items()))
0 голосов
/ 30 августа 2011

У диктанта нет ключей в заказе, заказ не гарантирован. Если вы хотите создать список словарей, вы потеряете ключевую информацию.

Если вам нужны отсортированные итерации, вы можете использовать

for key in sorted(dict):
    ....
...