Сумма значений с тем же именем после поиска из словаря - PullRequest
2 голосов
/ 13 февраля 2020

Список строк, эта часть строки, является ключом в словаре. Я хочу вернуть значения из словаря по ключам, а затем сложить значения.

d = {"2016_05" : 665,
"2016_04" : 462,
"2015_03" : 568,
"2015_08" : 895}

for a in ['Toyota_2015_03', 'Toyota_2015_04', 'Kia_2016_01', 'Kia_2016_04', 'Kia_2016_05']:
    name, year, month = a.split('_')
    sales = d.get(year + '_' + month)

    if sales is not None:
        print (name + '_' + str(sales))

вывод:

Toyota_568
Kia_462
Kia_665

Я хочу суммировать число по Kia и Toyota '(т.е. какая-то форма, чтобы получить Kia: 1127, Toyota: 568). Каков хороший способ продолжить? Спасибо.

Ответы [ 5 ]

2 голосов
/ 13 февраля 2020

вы можете использовать словарь для хранения вашего вывода:

result = {}
for e in data:
    name, year_month =  e.split('_', 1)
    result[name] = result.get(name, 0) + d.get(year_month, 0)

result

вывод:

{'Toyota': 568, 'Kia': 1127}

, если вы не хотите иметь ключи с 0 в качестве значения, если year_month не находится в переменной d, вы можете использовать:

result = {}
for e in data:
    name, year_month =  e.split('_', 1)
    sales = d.get(year_month, None)

    if sales is not None:
        result[name] = result.get(name, 0) + sales
1 голос
/ 13 февраля 2020

Используйте другое слово для суммирования продаж. Вы можете использовать dict.get() со значением по умолчанию для имитации defaultdict

all_sales = {}

for a in ['Toyota_2015_03', 'Toyota_2015_04', 'Kia_2016_01', 'Kia_2016_04', 'Kia_2016_05']:
    name, year, month = a.split('_')
    sales = d.get(year + '_' + month, 0)
    if sales: # can be removed if you don't have car types with no sales or you want to see those cars
        all_sales[name] = all_sales.get(name, 0) + sales

print(all_sales)

Выход

{'Toyota': 568, 'Kia': 1127}
1 голос
/ 13 февраля 2020

Использование collections.defaultdict

Пример:

from collections import defaultdict  
d = {'2016_05': 665, '2016_04': 462, '2015_03': 568, '2015_08': 895}

result = defaultdict(int)
for a in ['Toyota_2015_03', 'Toyota_2015_04', 'Kia_2016_01', 'Kia_2016_04', 'Kia_2016_05']:
    name, year_month = a.split('_', 1)    #split with maxsplit param
    sales = d.get(year_month)

    if sales is not None:
        result[name] +=sales              #Increment Count
print(result)

Выход:

defaultdict(<class 'int'>, {'Toyota': 568, 'Kia': 1127})
1 голос
/ 13 февраля 2020

Попробуйте это. Используя чистый python диктонар.

>>> d = {"2016_05" : 665, "2016_04" : 462, "2015_03" : 568, "2015_08" 
    : 895}
>>> li = ['Toyota_2015_03', 'Toyota_2015_04', 'Kia_2016_01', 
   'Kia_2016_04', 'Kia_2016_05']
>>> cars = dict()
>>> for ele in li:
...     name, year, month = ele.split('_')
...     sales = year+'_'+month
...     if sales in d.keys():
...             if name in cars.keys():
...                     cars[name] += d[sales]
...             else:
...                     cars[name] = d[sales]
... 
>>> cars
{'Toyota': 568, 'Kia': 1127}
>>> 
1 голос
/ 13 февраля 2020

Это будет работать.

d = {"2016_05" : 665,
"2016_04" : 462,
"2015_03" : 568,
"2015_08" : 895}
new_d = {}
for a in ['Toyota_2015_03', 'Toyota_2015_04', 'Kia_2016_01', 'Kia_2016_04', 'Kia_2016_05']:
    name, year, month = a.split('_')
    sales = d.get(year + '_' + month)

    if sales is not None:
        if name in new_d:
            new_d[name] = new_d[name] + sales
        else:
            new_d[name] = sales
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...