Python как добавить суммы из нескольких списков - PullRequest
0 голосов
/ 29 ноября 2018

Ниже приведен список списков.Как добавить суммы только «Всего черного» и «Всего цвета» в один список, сохранив только «Идентификатор учетной записи» и «Имя учетной записи»?

[[{'Total Black': 3, 'Total Color': 2, 'Account ID': '2222', 'Account Name': 'Moe'}, 
  {'Total Black': 5, 'Total Color': 4, 'Account ID': '3333', 'Account Name': 'Larry'}, 
  {'Total Black': 9, 'Total Color': 6, 'Account ID': '4444', 'Account Name': 'Curly'}], 
 [{'Total Black': 8, 'Total Color': 4, 'Account ID': '2222', 'Account Name': 'Moe'}, 
  {'Total Black': 2, 'Total Color': 7, 'Account ID': '3333', 'Account Name': 'Larry'}, 
  {'Total Black': 11, 'Total Color': 9, 'Account ID': '4444', 'Account Name': 'Curly'}]]

Таким образом, результат будет:

[{'Total Black': 11, 'Total Color': 6, 'Account ID': '2222', 'Account Name': 
'Moe'}, {'Total Black': 7, 'Total Color': 11, 'Account ID': '3333', 'Account 
Name': 'Larry'}, {'Total Black': 20, 'Total Color': 15, 'Account ID': 4444, 
'Account Name': 'Curly'}]

Ответы [ 4 ]

0 голосов
/ 29 ноября 2018

Настройка

thing = [
    [{'Total Black': 3, 'Total Color': 2, 'Account ID': '2222', 'Account Name': 'Moe'}, 
     {'Total Black': 5, 'Total Color': 4, 'Account ID': '3333', 'Account Name': 'Larry'}, 
     {'Total Black': 9, 'Total Color': 6, 'Account ID': '4444', 'Account Name': 'Curly'}], 
    [{'Total Black': 8, 'Total Color': 4, 'Account ID': '2222', 'Account Name': 'Moe'}, 
     {'Total Black': 2, 'Total Color': 7, 'Account ID': '3333', 'Account Name': 'Larry'}, 
     {'Total Black': 11, 'Total Color': 9, 'Account ID': '4444', 'Account Name': 'Curly'}]
]

Очень похоже на ScottBoston

pd.DataFrame(sum(thing, [])).groupby(
    ['Account ID', 'Account Name'], as_index=False
).sum().to_dict('r')

merge_with

from itertools import chain
from toolz.dicttoolz import merge_with
from collections import defaultdict

idkey = ('Account ID', 'Account Name')

x = defaultdict(list)
for d in map(dict, chain(*thing)):
  x[(*map(d.pop, idkey),)].append(d)

[{**dict(zip(idkey, key)), **merge_with(sum, *d)} for key, d in x.items()]

[{'Account ID': '2222',
  'Account Name': 'Moe',
  'Total Black': 11,
  'Total Color': 6},
 {'Account ID': '3333',
  'Account Name': 'Larry',
  'Total Black': 7,
  'Total Color': 11},
 {'Account ID': '4444',
  'Account Name': 'Curly',
  'Total Black': 20,
  'Total Color': 15}]
0 голосов
/ 29 ноября 2018

Без решения Pandas:

from itertools import groupby
from operator import itemgetter

orders_list = [[{'Total Black': 3, 'Total Color': 2, 'Account ID': '2222', 'Account Name': 'Moe'}, 
  {'Total Black': 5, 'Total Color': 4, 'Account ID': '3333', 'Account Name': 'Larry'}, 
  {'Total Black': 9, 'Total Color': 6, 'Account ID': '4444', 'Account Name': 'Curly'}], 
 [{'Total Black': 8, 'Total Color': 4, 'Account ID': '2222', 'Account Name': 'Moe'}, 
  {'Total Black': 2, 'Total Color': 7, 'Account ID': '3333', 'Account Name': 'Larry'}, 
  {'Total Black': 11, 'Total Color': 9, 'Account ID': '4444', 'Account Name': 'Curly'}]]


result_list = []

flattened_list = [item for sublist in orders_list for item in sublist]
grouper = itemgetter("Account ID", "Account Name")

for key, grp in groupby(sorted(flattened_list, key = grouper), grouper):
    temp_dict = dict(zip(["Account ID", "Account Name"], key))
    total_black_count = 0
    total_colors_count = 0
    for element in grp:
          total_black_count += element['Total Black']
          total_colors_count += element['Total Color']

    temp_dict["Total Color"] = total_colors_count
    temp_dict["Total Black"] = total_black_count
    result_list.append(temp_dict)

for dictionary in result_list:
    for key, values in dictionary.items():
        print(f"{key}: {values}")

DEMO FIDDLE

0 голосов
/ 29 ноября 2018

Давайте использовать pandas.

#From @C14L setup:

li = [
    [
        {'Total Black': 3, 'Total Color': 2, 'Account ID': '2222', 'Account Name': 'Moe'},
        {'Total Black': 5, 'Total Color': 4, 'Account ID': '3333', 'Account Name': 'Larry'},
        {'Total Black': 9, 'Total Color': 6, 'Account ID': '4444', 'Account Name': 'Curly'}
    ],
    [
        {'Total Black': 8, 'Total Color': 4, 'Account ID': '2222', 'Account Name': 'Moe'},
        {'Total Black': 2, 'Total Color': 7, 'Account ID': '3333', 'Account Name': 'Larry'},
        {'Total Black': 11, 'Total Color': 9, 'Account ID': '4444', 'Account Name': 'Curly'}
    ]
]

pd.concat([pd.DataFrame(li[i]) for i in range(len(li))])\
  .groupby(['Account ID','Account Name'])\
  .sum()\
  .reset_index()\
  .to_dict(orient='records')

Вывод:

[{'Account ID': '2222',
  'Account Name': 'Moe',
  'Total Black': 11,
  'Total Color': 6},
 {'Account ID': '3333',
  'Account Name': 'Larry',
  'Total Black': 7,
  'Total Color': 11},
 {'Account ID': '4444',
  'Account Name': 'Curly',
  'Total Black': 20,
  'Total Color': 15}]

Подробности:

Сначала мы используем понимание списка и конструктор pandas dataframe для построения фреймов данных для каждогоэлемент вашего оригинального списка списка со словарями.

Затем используйте pd.concat, чтобы объединить эти два, в данном случае кадры данных, в один объединенный кадр данных.

Используйте groupby с суммой для агрегирования значений Total Color и Total Black.

Наконец, сбросьте индекс и to_dict для вывода комбинированного кадра данных в виде словаря.

0 голосов
/ 29 ноября 2018
li = [
    [
        {'Total Black': 3, 'Total Color': 2, 'Account ID': '2222', 'Account Name': 'Moe'},
        {'Total Black': 5, 'Total Color': 4, 'Account ID': '3333', 'Account Name': 'Larry'},
        {'Total Black': 9, 'Total Color': 6, 'Account ID': '4444', 'Account Name': 'Curly'}
    ],
    [
        {'Total Black': 8, 'Total Color': 4, 'Account ID': '2222', 'Account Name': 'Moe'},
        {'Total Black': 2, 'Total Color': 7, 'Account ID': '3333', 'Account Name': 'Larry'},
        {'Total Black': 11, 'Total Color': 9, 'Account ID': '4444', 'Account Name': 'Curly'}
    ]
]

result = [
    {
        'sum': x['Total Black'] + x['Total Color'],
        'Account ID': x['Account ID'],
        'Account Name': x['Account Name']
    } for x in li[0]
]

Дает в качестве результата для первого подсписка

[
    {'sum': 5, 'Account ID': '2222', 'Account Name': 'Moe'},
    {'sum': 9, 'Account ID': '3333', 'Account Name': 'Larry'},
    {'sum': 15, 'Account ID': '4444', 'Account Name': 'Curly'},
]

Это то, что вы искали?

Теперь вам просто нужно повторить внешний список, чтобы повторитьэто для каждого содержащегося списка.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...