Форум программистов, компьютерный форум, киберфорум
Python: Решение задач
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.50/6: Рейтинг темы: голосов - 6, средняя оценка - 4.50
0 / 0 / 0
Регистрация: 11.02.2020
Сообщений: 11

Как в списке со словарями, сложить значения списков по полю product_id&&

27.10.2021, 16:24. Показов 1211. Ответов 8

Студворк — интернет-сервис помощи студентам
У меня есть список со словарями:
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
[
    {
        "product_id": 2855549,
        "total": 15.43,
        "qty": 1.0
    },
    {
        "product_id": 2860662,
        "total": 12.67,
        "qty": 1.0
    },
    {
        "product_id": 2855549,
        "total": 15.86,
        "qty": 1.0
    },
    {
        "product_id": 2855549,
        "total": 14.21,
        "qty": 1.0
    },
    {
        "product_id": 2860662,
        "total": 31.05,
        "qty": 1.0
    },
    ...
]
Мне нужно в списке все словари с одинаковыми product_id превратить в один словарь, при этом поля total и qty сложить.
Это:
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
[
    {
        "product_id": 2855549,
        "total": 15.43,
        "qty": 1.0
    },
    {
        "product_id": 2860662,
        "total": 12.67,
        "qty": 1.0
    },
    {
        "product_id": 2855549,
        "total": 15.86,
        "qty": 1.0
    },
    {
        "product_id": 2855549,
        "total": 14.21,
        "qty": 1.0
    },
    {
        "product_id": 2860662,
        "total": 31.05,
        "qty": 1.0
    },
    ...
]
превратить в это:
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
[
    {
        "product_id": 2855549,
        "total": 45.50,
        "qty": 3.0
    },
    {
        "product_id": 2860662,
        "total": 43.72,
        "qty": 2.0
    },
    ...
]
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
27.10.2021, 16:24
Ответы с готовыми решениями:

query='SELECT * FROM resume WHERE ' & ''' & RecSet('place')& ''' & '=' & '''& s_loc &''' & - что не так?
упростил для краткости запрос. в чем ошибка? RecSet - это коннекшн. query='SELECT * FROM resume WHERE ' & ''' &...

error '80020009' Îøèáêà. /lalala/profile.asp, line 28
При простейшем и сто раз работавшем скрипте, вылетает ошибка! след. содержания error '80020009' ...

Помогите найти драйвера для pci\ven_8086&DEV_266E&SUBSYS_A002145&REV_05\3&13C0B0C5&0&F2
pci\ven_8086&DEV_266E&SUBSYS_A002145&REV_05\3&13C0B0C5&0&F2 Мультимедиа аудиоконтроллер помогите плз найти...

8
enx
 Аватар для enx
1190 / 766 / 277
Регистрация: 05.09.2021
Сообщений: 1,772
27.10.2021, 16:43
Doof, какие ограничения, второй словарь допускается или сжимаем исходный список словарей?
0
0 / 0 / 0
Регистрация: 11.02.2020
Сообщений: 11
27.10.2021, 17:06  [ТС]
Не важно мне любой вариант подходит!
0
enx
 Аватар для enx
1190 / 766 / 277
Регистрация: 05.09.2021
Сообщений: 1,772
27.10.2021, 17:22
Лучший ответ Сообщение было отмечено Doof как решение

Решение

Doof, ок, голова плохо варит ночью, сейчас накидаю

Добавлено через 6 минут
Doof, держи, тут есть решение по интереснее, но уже завтра.

Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
d = [
    {
        "product_id": 2855549,
        "total": 15.43,
        "qty": 1.0
    },
    {
        "product_id": 2860662,
        "total": 12.67,
        "qty": 1.0
    },
    {
        "product_id": 2855549,
        "total": 15.86,
        "qty": 1.0
    },
    {
        "product_id": 2855549,
        "total": 14.21,
        "qty": 1.0
    },
    {
        "product_id": 2860662,
        "total": 31.05,
        "qty": 1.0
    }]
 
res = []
tmp = {}
for i in d:
    d1, d2, d3 = i.items()
    if d1[1] not in tmp:
        tmp[d1[1]] = len(res)
        res.append(i)
    else:
        t = res[tmp[d1[1]]]
        t['total'] = t.get('total') + d2[1]
        t['qty'] = t.get('qty') + d3[1]
 
print(*res, sep='\n')
Bash
1
2
{'product_id': 2855549, 'total': 45.5, 'qty': 3.0}
{'product_id': 2860662, 'total': 43.72, 'qty': 2.0}
1
0 / 0 / 0
Регистрация: 11.02.2020
Сообщений: 11
27.10.2021, 17:40  [ТС]
Жду завтра еще интересный ответ, спасибо
0
Эксперт Python
8851 / 4502 / 1864
Регистрация: 27.03.2020
Сообщений: 7,317
27.10.2021, 18:26
Doof, можно через pandas
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
import pandas as pd
import numpy as np
d = [
    {
        "product_id": 2855549,
        "total": 15.43,
        "qty": 1.0
    },
    {
        "product_id": 2860662,
        "total": 12.67,
        "qty": 1.0
    },
    {
        "product_id": 2855549,
        "total": 15.86,
        "qty": 1.0
    },
    {
        "product_id": 2855549,
        "total": 14.21,
        "qty": 1.0
    },
    {
        "product_id": 2860662,
        "total": 31.05,
        "qty": 1.0
    }]
 
df = pd.DataFrame(d)
print(df)
 
res = df.groupby('product_id').agg({'total': np.sum, 'qty': np.sum}).reset_index()
print(res)
 
res = res.to_dict('records')
print(res)
2
enx
 Аватар для enx
1190 / 766 / 277
Регистрация: 05.09.2021
Сообщений: 1,772
28.10.2021, 04:54
Doof, привел в порядок первый вариант, чтобы без лишних телодвижений. Вариант с паднас уже дали, я не был уверен вчера как его сделать.

Python
1
2
3
4
5
6
7
8
9
10
11
12
res = []
tmp = {}
for i in d:
    if i['product_id'] not in tmp:
        tmp[i['product_id']] = len(res)
        res.append(i)
    else:
        t = res[tmp[i['product_id']]]
        t['total'] = t.get('total') + i['total']
        t['qty'] = t.get('qty') + i['qty']
 
print(*res, sep='\n')
Добавлено через 2 минуты
Gdez, очень хороший вариант, надо запомнить, но не подскажешь, почему он такой медленный на таком датасете?
0
Эксперт Python
8851 / 4502 / 1864
Регистрация: 27.03.2020
Сообщений: 7,317
28.10.2021, 05:09
enx, загрузка самой pandas ~ 0.5 сек

Добавлено через 2 минуты
Как и похожие (numpy scipy и тп) хорошо работают с большими объемами данных.
На небольших "чистый" python ес-но быстрее
1
enx
 Аватар для enx
1190 / 766 / 277
Регистрация: 05.09.2021
Сообщений: 1,772
28.10.2021, 05:27
Gdez, спасибо, примерно так и думал
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
28.10.2021, 05:27
Помогаю со студенческими работами здесь

Мультимедиа контролер PCI\VEN_14F1&DEV_8800&SUBSYS_EA3D14F1&REV_05\4&25700A26&0&3020
Помогите пожалуйста найти драйвер на мультимедиа видеоконтролер ...

немогу найти драйвера на PCI\VEN_1039&DEV_7012&SUBSYS_810D1043&REV_A0\3&61AAA01&0&17
Мультимедиа аудиоконтроллер PCI\VEN_1039&DEV_7012&SUBSYS_810D1043&REV_A0\3&61AAA01&0&17

Нужен драйвера, код PCI\VEN_1039&DEV_7012&SUBSYS_0C98105B&REV_A0\3&B1BFB68&0&17
всем привет !! уменя нет звука нужен драйвер код PCI\VEN_1039&DEV_7012&SUBSYS_0C98105B&REV_A0\3&B1BFB68&0&17 скачал прогу их много ...

Драйвера на PCI\VEN_10B7&DEV_1700&SUBSYS_80EB1043&REV_12\4&2E98101C&0&28 F0
помогите плиз - вот ID: PCI\VEN_10B7&DEV_1700&SUBSYS_80EB1043&REV_12\4&2E98101C&0&28F0 Заранее...

Кто встречался с таким, подскажите - (#206;áúåêò)
Если на asp-странице происходит ошибка, то сервер выдает сообщение вот примерно в таком виде: ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Новые блоги и статьи
Вывод данных через динамический список в справочнике
Maks 01.04.2026
Реализация из решения ниже выполнена на примере нетипового справочника "Спецтехника" разработанного в конфигурации КА2. Задача: вывести данные из ТЧ нетипового документа. . .
Функция заполнения текстового поля в реквизите формы документа
Maks 01.04.2026
Алгоритм из решения ниже реализован на нетиповом документе "ВыдачаОборудованияНаСпецтехнику" разработанного в конфигурации КА2, в дополнении к предыдущему решению. На форме документа создается. . .
К слову об оптимизации
kumehtar 01.04.2026
Вспоминаю начало 2000-х, университет, когда я писал на Delphi. Тогда среди программистов на форумах активно обсуждали аккуратную работу с памятью: нужно было следить за переменными, вовремя. . .
Идея фильтра интернета (сервер = слой+фильтр).
Hrethgir 31.03.2026
Суть идеи заключается в том, чтобы запустить свой сервер, о чём я если честно мечтал давно и давно приобрёл книгу как это сделать. Но не было причин его запускать. Очумелые учёные напечатали на. . .
Модель здравосоХранения 6. ESG-повестка и устойчивое развитие; углублённый анализ кадрового бренда
anaschu 31.03.2026
В прикрепленном документе раздумья о том, как можно поменять модель в будущем
10 пpимет, которые всегда сбываются
Maks 31.03.2026
1. Чтобы, наконец, пришла маршрутка, надо закурить. Если сигарета последняя, маршрутка придет еще до второй затяжки даже вопреки расписанию. 2. Нaдоели зима и снег? Не надо переезжать. Достаточно. . .
Перемещение выделенных строк ТЧ из одного документа в другой
Maks 31.03.2026
Реализация из решения ниже выполнена на примере нетипового документа "ВыдачаОборудованияНаСпецтехнику" с единственной табличной частью "ОборудованиеИКомплектующие" разработанного в конфигурации КА2. . . .
Functional First Web Framework Suave
DevAlt 30.03.2026
Sauve. IO Апнулись до NET10. Из зависимостей один пакет, работает одинаково хорошо как в режиме проекта так и в интерактивном режиме. из сложностей - чисто функциональный подход. Решил. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru