Macin
Macin

Reputation: 391

List of dictionaries - subtract a constant from each dictionary value

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

Answers (1)

Martijn Pieters
Martijn Pieters

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

Related Questions