2014-08-27 3 views
-1

У меня есть defaultdict с несортированным ключевыми ценностями:Python копирование defaultdict в Сыроватского с новым порядком ключом

d = defaultdict(int) 
... 
defaultdict(<type 'int'>, {'2014-06-30': 2, '2013-04-18': 7, '2013-04-19': 9}) 

Сортировать список ключей:

tmp = sorted(d.keys()) 

и создавать новый ДИКТ:

nd = {} 
for i in tmp: 
    nd[i] = d[i] 

Но в результате я получаю точную копию источника dict. Хотя я добавил элементы в новом порядке.

+1

вам нужен OrderedDict –

ответ

1
from collections import OrderedDict 
ord_dict = OrderedDict() 

for i in tmp: 
    ord_dict[i] = d[i] 
print(ord_dict) 
OrderedDict([('2013-04-18', 7), ('2013-04-19', 9), ('2014-06-30', 2)]) 

Или, как @ Джон Клементс предлагает просто:

OrderedDict(sorted(d.iteritems())) 

Или OrderedDict(sorted(d.items())) с помощью Python 3

+1

'OrderedDict (упорядоченные (d.iteritems())) 'возможно? Также не назвал бы это 'ord', поскольку это встроенная функция ... –

+0

@JonClements, просто писал это и да вы правы, изменил ord. –

+0

Ну, если вы * действительно хотели бы, чтобы он был совместим с 2.x/3.x, тогда 'OrderedDict ((k, d [k]) для k в отсортированном (d))', но это только немного бит смешно :) –

3

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

0

словари python не работают таким образом. Словарь на самом деле представляет собой хеш-карту, которая означает, что значения помещаются в точку в dict в зависимости от ключевого хеша, а не от того, что вы поместите свой предмет, а когда итерации, вы не получите «заказанный дикт». Используйте OrderedDict класс вместо

Смежные вопросы