Сортировка ключей словаря в естественном порядке

Я хочу отсортировать ключи словаря в «естественном порядке». Если у меня есть словарь с ключами

    d = {"key1" : object, "key11" : object, "key2" : object, "key22" : object", "jay1" : object, "jay2" : object}

Я хочу отсортировать этот словарь, поэтому результат:

    d = { "jay1" : object, "jay2" : object, "key_1" : object, "key_2" : object, "key_11" : object, "key_22" : object"}

person user2909250    schedule 12.06.2014    source источник
comment
Используйте docs.python.org/2/library/.   -  person marcadian    schedule 12.06.2014
comment
Словари не упорядочены. Вы не можете контролировать порядок ключей словаря.   -  person BrenBarn    schedule 12.06.2014
comment
Вы спрашиваете, как сортировать словарь (в этом случае вопрос является дубликатом) или как сортировать (что-либо) в естественном порядке (в любом случае это почти наверняка дубликат)?   -  person Bakuriu    schedule 12.06.2014
comment
Я не верю, что это дубликат, потому что вопрос, в котором он помечен как дубликат, касается стандартной сортировки, а этот вопрос касается естественной сортировки.   -  person ThomasW    schedule 27.11.2017


Ответы (4)


Вы можете изменить свой словарь на OrderedDict:

import collections, re

d = {"key1" : 'object', "key11" : 'object', "key2" : 'object', "key22" : 'object', "jay1" : 'object', "jay2" : 'object'}


my_fun = lambda k,v: [k, int(v)]

d2 = collections.OrderedDict(sorted(d.items(), key=lambda t: my_fun(*re.match(r'([a-zA-Z]+)(\d+)',t[0]).groups())))

print(d2)
#reslt: OrderedDict([('jay1', 'object'), ('jay2', 'object'), ('key1', 'object'), ('key11', 'object'), ('key2', 'object'), ('key22', 'object')])

По сути, здесь происходит то, что я разделяю строки на «строковую» часть и числовую часть. Числовая часть меняется на int, и сортировка происходит по этим двум значениям.

person Marcin    schedule 12.06.2014
comment
Это не сортирует ключи в естественном порядке. - person user2909250; 12.06.2014
comment
@user2909250 user2909250 Извините, я исправил пример, включив в него отсутствующий естественный порядок. - person Marcin; 12.06.2014
comment
Вы можете избежать длинного lambda и регулярного выражения, используя natsort.natsorted. - person SethMMorton; 15.01.2015

Как уже говорили другие, словари не упорядочены. Однако, если вы хотите перебирать эти ключи в естественном порядке, вы можете сделать что-то вроде следующего:

d = {"key1" : object, "key11" : object, "key2" : object, "key22" : object, "jay1" : object, "jay2" : object}
sortedKeys = sorted(d.keys())
print sortedKeys
for key in sortedKeys:
    print d[key]
person Bryan    schedule 12.06.2014

В Python {'a': object, 'b': object} точно такой же, как {'b': object, 'a': object}, потому что словари не упорядочены.

person DanielSank    schedule 12.06.2014

Вы не можете заказать dictionaries, потому что их порядок на первый взгляд произвольный (на самом деле это не так). Вместо этого вы можете отсортировать items(), используя natsort.natsorted():

d = {"key1" : object, "key11" : object, "key2" : object, "key22" : object, "jay1" : object, "jay2" : object}
print natsort.natsorted(d.items()) #[('jay1', <type 'object'>), ('jay2', <type 'object'>), ('key1', <type 'object'>), ('key2', <type 'object'>), ('key11', <type 'object'>), ('key22', <type 'object'>)]
person A.J. Uppal    schedule 12.06.2014
comment
Это не сортирует ключи в естественном порядке. - person user2909250; 12.06.2014
comment
@user2909250 user2909250 теперь это так :) - person A.J. Uppal; 12.06.2014