i have a dictionary like this and i want to compare it with a list
dic=
{0: 0,
1: 1200,
2: 2400,
3: 1800,
4: 2400,
5: 2400,
6: 1200,
7: 1800,
8: 2400}
list = [0,2,5,7]
How can I create sum over the list with the values from the dictionary?
sum = 0 2400 2400 1800
Thanks!
UPDATE
and how is it if I want to compare it with another dictionary instead of the list? so I need a sum for 0 and 1
dic2=
{Route1: [0, 2, 5, 7]
Route2: [0, 1, 3, 5, 8, 4}
CodePudding user response:
You can call dict.get passing 0 as default value for each key in the list, then call sum over it:
>>> sum(dic.get(key, 0) for key in list)
Out[5]: 6600
On a side note, don't use list as a variable name as it will mask built-in list constructor.
Or, you can use itemgetter from operator, and pass unpacked list, finally use sum for these values. Be noted that you'll get value error if some keys in list doesn't exist in dictionary:
>>> from operator import itemgetter
>>> sum(itemgetter(*list)(dic))
Out[8]: 6600
CodePudding user response:
The simplest approach is:
dic = {0: 0,
1: 1200,
2: 2400,
3: 1800,
4: 2400,
5: 2400,
6: 1200,
7: 1800,
8: 2400}
dic2 = {0: [0, 2, 5, 7],
1: [0, 1, 3, 5, 8, 4]}
results = {}
for key, value in dic2.items():
total = 0
for i in value:
new_value = dic[i]
total = new_value
results.update({f'Route{key 1}': total})
print(results)
I suggest you always write the simplest code possible. Unnecessarily complex code, is bad code:
Simple is better than complex.
From the Zen of Python.
CodePudding user response:
For the first case, you can use this:
dic= { 0: 0,
1: 1200,
2: 2400,
3: 1800,
4: 2400,
5: 2400,
6: 1200,
7: 1800,
8: 2400
}
lst = [0,2,5,7]
res1 = sum(map(lambda x: dic[x], lst))
print(res1)
# 6600
And for the second case, use list comprehension:
dic= { 0: 0,
1: 1200,
2: 2400,
3: 1800,
4: 2400,
5: 2400,
6: 1200,
7: 1800,
8: 2400
}
dic2 = {'Route1': [0, 2, 5, 7],
'Route2': [0, 1, 3, 5, 8, 4]}
res2 = [sum(map(lambda x: dic[x], dic2[i])) for i in dic2]
print(res2)
# [6600, 10200]
Or dict comprehension:
dic= { 0: 0,
1: 1200,
2: 2400,
3: 1800,
4: 2400,
5: 2400,
6: 1200,
7: 1800,
8: 2400
}
dic2 = {'Route1': [0, 2, 5, 7],
'Route2': [0, 1, 3, 5, 8, 4]}
dic3 = {k: sum(map(lambda x: dic[x], dic2[k])) for k, v in dic2.items()}
print(dic3)
# {'Route1': 6600, 'Route2': 10200}
