Что я имею:

d = {datetime.date(2013, 1, 1): {'15169': 2, '56203': 5, '2519': 3, '18144': 3, '9737': 4},
datetime.date(2014, 1, 1): {'15169': 5, '56203': 3, '2519': 2, '18144': 1, '9737': 0}}

Что я хочу:

{15169:[2,5], 56203:[5,3], 2519:[3,2], 18144:[3,1], 9737:[4,0]}

Есть ли какой-нибудь простой способ добиться этого? Пробовал несколько способов, но похоже, что прямого метода нет.

0
ribash sharma 23 Ноя 2021 в 21:40
1
Это зависит от того, что вы считаете простым или нет.
 – 
mkrieger1
23 Ноя 2021 в 21:45
Я бы счел простым перебрать словари в d и добавить содержащиеся значения в соответствующие списки в словаре результатов.
 – 
mkrieger1
23 Ноя 2021 в 21:47
«Пробовали несколько способов, но похоже, что нет никакого прямого метода». Какие способы пробовали? Почему вы думали, что они «не прямолинейны»?
 – 
Karl Knechtel
23 Ноя 2021 в 21:56

3 ответа

Лучший ответ
ans = {}
[[ans.setdefault(k, []).append(v) for k, v in x.items()] for x in d.values()]
ans
# {'15169': [2, 5],
#  '56203': [5, 3],
#  '2519': [3, 2],
#  '18144': [3, 1],
#  '9737': [4, 0]}

Или используя панд

pd.DataFrame(d).apply(list, axis=1).to_dict()
# {'15169': [2, 5],
#  '56203': [5, 3],
#  '2519': [3, 2],
#  '18144': [3, 1],
#  '9737': [4, 0]}
1
d.b 23 Ноя 2021 в 21:56

Настолько просто, насколько я могу представить, используйте defaultdict:

from collections import defaultdict

out = defaultdict(list)

for x in d.values():
    for k,v in x.items():
        out[k].append(v)

Выход:

defaultdict(list,
            {'15169': [2, 5],
             '56203': [5, 3],
             '2519': [3, 2],
             '18144': [3, 1],
             '9737': [4, 0]})
0
Quang Hoang 23 Ноя 2021 в 21:49

Возможно, я ошибаюсь, но я не знаю ни одного метода, который позволил бы достичь того, чего вы хотите достичь. Даже в этом случае достижение этого конкретного результата не должно быть трудным. Я думаю, что лучший способ - реализовать свой собственный метод group-by()! Постарайтесь продумать шаги, которые необходимо предпринять, чтобы сгруппировать данные, которые у вас есть в исходном Dictionary, в нужный вам объект. Похоже, вы группируете по p-> d, где p - это ключ словаря, а d - ключ к этому свойству взамен. Это в точности группировка по p-> d! Я не знаю, достаточно ли ясен этот ответ, я не хочу предоставлять код, чтобы вы не пропустили свой опыт обучения, но если он вам понадобится, просто спросите, и я постараюсь предоставить вам пример: )

0
Requieem 23 Ноя 2021 в 21:50