I have got pretty simple list:
example_list = [
{'points': 400, 'gold': 2480},
{'points': 100, 'gold': 610},
{'points': 100, 'gold': 620},
{'points': 100, 'gold': 620}
]
How can I sum all gold values? I’m looking for nice oneliner.
Now I’m using this code (but it’s not the best solution):
total_gold = 0
for item in example_list:
total_gold += example_list["gold"]
Answers:
Thank you for visiting the Q&A section on Magenaut. Please note that all the answers may not help you solve the issue immediately. So please treat them as advisements. If you found the post helpful (or not), leave a comment & I’ll get back to you as soon as possible.
Method 1
sum(item['gold'] for item in myList)
Method 2
If you’re memory conscious:
sum(item['gold'] for item in example_list)
If you’re extremely time conscious:
sum([item['gold'] for item in example_list])
In most cases just use the generator expression, as the performance increase is only noticeable on a very large dataset/very hot code path.
See this answer for an explanation of why you should avoid using map.
See this answer for some real-world timing comparisons of list comprehension vs generator expressions.
Method 3
If you prefer map, this works too:
import operator
total_gold = sum(map(operator.itemgetter('gold'),example_list))
But I think the generator posted by g.d.d.c is significantly better. This answer is really just to point out the existence of operator.itemgetter.
Method 4
from collections import Counter
from functools import reduce
from operator import add
sum_dict = reduce(add, (map(Counter, example_list)))
# Counter({'points': 700, 'gold': 4330})
total_gold = sum_dict['gold']
Method 5
example_list = [
{'points': 400, 'gold': 2480},
{'points': 100, 'gold': 610},
{'points': 100, 'gold': 620},
{'points': 100, 'gold': 620}
]
result = np.sum([x['gold'] for x in example_list])
print(result)
output
4330
All methods was sourced from stackoverflow.com or stackexchange.com, is licensed under cc by-sa 2.5, cc by-sa 3.0 and cc by-sa 4.0