Reputation: 391
I have a list of dictionaries:
list = [{'score': 93, 'numrep': 0}, {'score': 32, 'numrep': 0}, {'score': 39, 'numrep': 0}, {'score': 81, 'numrep': 0}, {'score': 82, 'numrep': 0}]
What would be the most efficient way to subtract constant x = 1 from each score value, so I the resulting list would be:
resulting_list = [{'score': 92, 'numrep': 0}, {'score': 31, 'numrep': 0}, {'score': 38, 'numrep': 0}, {'score': 80, 'numrep': 0}, {'score': 81, 'numrep': 0}]
Upvotes: 0
Views: 2091
Reputation: 1121486
If you want to modify the dicts in place, use a loop:
for d in lst:
d['score'] -= 1
If you need a copy of all dictionaries, a list comprehension with nested dict comprehension works but may not be the most efficient:
[{k: v - 1 if k == 'score' else v for k, v in d.iteritems()} for d in lst]
Demo of the latter:
>>> lst = [{'score': 93, 'numrep': 0}, {'score': 32, 'numrep': 0}, {'score': 39, 'numrep': 0}, {'score': 81, 'numrep': 0}, {'score': 82, 'numrep': 0}]
>>> [{k: v - 1 if k == 'score' else v for k, v in d.iteritems()} for d in lst]
[{'score': 92, 'numrep': 0}, {'score': 31, 'numrep': 0}, {'score': 38, 'numrep': 0}, {'score': 80, 'numrep': 0}, {'score': 81, 'numrep': 0}]
A function that creates a copy of the dictionary and adjusts the score:
def subtract_score(d):
d = d.copy()
d['score'] -= 1
return d
then
[subtract_score(d) for d in lst]
may be faster for larger dictionaries.
Upvotes: 3