У меня есть следующий список словарей:
[{'17': 1}, {'17': 1, '19': 1}, {'8': 1, '9': 2, '12': 3}, {'23': 3}]
Я хочу объединить словари в списке, что я делаю:
from collections import Counter
c = Counter()
for d in hourofDayData:
c.update(d)
temp = dict(c)
для чего я получаю следующий результат:
{'17': 2, '19': 1, '8': 1, '9': 2, '12': 3, '23': 3}
это то, что я хочу, за исключением того, что это не заказано. Я хочу, чтобы приведенный выше словарь выглядел так:
{'8': 1, '9': 2, '12': 3,'17': 2, '19': 1, '23': 3}
Я пробовал использовать collections.OrderedDict вот так:
OrderedDict([('12', 3), ('17', 2), ('19', 1), ('23', 3), ('8', 1), ('9', 2)])
Опять же, чего не заказывали. Как мне заказать словарь?
@ Аран-Фей, как мне получить отсортированный словарь?
OrderedDict отслеживает порядок вставки ключей / значений. Он выполняет сортировку нет по ключам (или значениям).






Сначала вы должны отсортировать словарь, а затем преобразовать его в orderdict. Проверьте следующий код.
import collections
from collections import Counter
hourofDayData = [{'17': 1}, {'17': 1, '19': 1}, {'8': 1, '9': 2, '12': 3}, {'23': 3}]
c = Counter()
for d in hourofDayData:
c.update(d)
temp = dict(c)
def get_key(key):
try:
return int(key)
except ValueError:
return key
print(collections.OrderedDict(sorted(temp.items(), key=lambda t: get_key(t[0]))))
Печать:
OrderedDict([('8', 1), ('9', 2), ('12', 3), ('17', 2), ('19', 1), ('23', 3)])
Данный:
times=[{'17': 1}, {'17': 1, '19': 1}, {'8': 1, '9': 2, '12': 3}, {'23': 3}]
Ты можешь сделать:
from collections import OrderedDict
cnt = {}
for d in times:
for k, v in d.items():
cnt[k]=cnt.get(k, 0)+v
>>> OrderedDict(sorted([(k,v) for k,v in cnt.items()], key=lambda t:int(t[0])))
OrderedDict([('8', 1), ('9', 2), ('12', 3), ('17', 2), ('19', 1), ('23', 3)])
С Python 3.6+ вам не нужно использовать OrderedDict, поскольку ключи обычного dict используют порядок вставки.
Python 3.7:
cnt = {}
for d in times:
for k, v in d.items():
cnt[k]=cnt.get(k, 0)+v
>>> dict(sorted([(k,v) for k,v in cnt.items()], key=lambda t:int(t[0])))
{'8': 1, '9': 2, '12': 3, '17': 2, '19': 1, '23': 3}
Два момента на заметку:
OrderedDict заказывается на вставку, а не по размеру.Учитывая эти аспекты, вы можете использовать sorted с настраиваемым key, определенным для создания списка кортежей. Затем передайте эту упорядоченную коллекцию в OrderedDict:
d = {'17': 2, '19': 1, '8': 1, '9': 2, '12': 3, '23': 3}
from collections import OrderedDict
res = OrderedDict(sorted(d.items(), key=lambda x: int(x[0])))
Результат:
OrderedDict([('8', 1), ('9', 2), ('12', 3), ('17', 2), ('19', 1), ('23', 3)])
Стоит отметить, что словари в Python 3.7 упорядочены по вставке, и на этот факт можно положиться. В этом случае OrderedDict можно заменить на dict при условии, что дополнительные методы OrderedDict не требуются.
Вам нужен словарь отсортированный, а не простой старый словарь заказал.