Python 从字典中查找后相同名称的和值

Python 从字典中查找后相同名称的和值,python,list,dictionary,sum,Python,List,Dictionary,Sum,字符串列表,即字符串的一部分,是字典中的一个键。我想从字典中按键返回值,然后对值求和 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('_')

字符串列表,即字符串的一部分,是字典中的一个键。我想从字典中按键返回值,然后对值求和

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
我想用“起亚”和“丰田”对数字求和(也就是说,用某种形式得到起亚:1127,丰田:568)。好的方法是什么?谢谢。

这会有用的

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

使用
collections.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)
Ex:

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})
{'Toyota': 568, 'Kia': 1127}
输出:

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})
{'Toyota': 568, 'Kia': 1127}
defaultdict(,{'Toyota':568,'Kia':1127})

试试这个。通过使用纯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}
>>> 

用另一个数字来计算销售额。您可以使用带有默认值的
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}

您可以使用字典保存输出:

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

result
输出:

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})
{'Toyota': 568, 'Kia': 1127}
如果
year\u month
不在变量
d
中,则不希望将
0
作为值的键包含在变量中,则可以使用:

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

你能解释一下你是如何得到“起亚:1127,丰田:568”的吗?@OlvinRoght,这就是我想去的地方…投票率较高。您可以避免检查时间戳的存在,在这种情况下只需添加零即可
d.get(year\u month,0)
@Pynchia。这可能会给出空的dict值。例如:
{'Toyota':568,'Kia':1127,'BMW':0}
…如果OP对此没有问题,那么使用
d.get(year\u month,0)
是完美的。感谢您在这个问题上的知识共享和帮助。考虑得真周到。但另一个答案来得更早,和你的答案一样直接。你介意我把它当作答案吗?很好,别担心:)