Python dictionary increment

Question:

In Python it’s annoying to have to check whether a key is in the dictionary first before incrementing it:

if key in my_dict:
  my_dict[key] += num
else:
  my_dict[key] = num

Is there a shorter substitute for the four lines above?

Asked By: Paul S.

||

Answers:

Answered By: Eric

You have quite a few options. I like using Counter:

>>> from collections import Counter
>>> d = Counter()
>>> d[12] += 3
>>> d
Counter({12: 3})

Or defaultdict:

>>> from collections import defaultdict
>>> d = defaultdict(int)  # int() == 0, so the default value for each key is 0
>>> d[12] += 3
>>> d
defaultdict(<function <lambda> at 0x7ff2fe7d37d0>, {12: 3})
Answered By: Blender

transform:

if key in my_dict:
  my_dict[key] += num
else:
  my_dict[key] = num

into the following using setdefault:

my_dict[key] = my_dict.setdefault(key, 0) + num
Answered By: dnozay

An alternative is:

my_dict[key] = my_dict.get(key, 0) + num
Answered By: Nicola Musatti

There is also a little bit different setdefault way:

my_dict.setdefault(key, 0)
my_dict[key] += num

Which may have some advantages if combined with other logic.

Answered By: Roman Susi

Any one of .get or .setdefault can be used:

.get() give default value passed in the function if there is no valid key

my_dict[key] = my_dict.get(key, 0) + num

.setdefault () create a key with default value passed

my_dict[key] = my_dict.setdefault(key, 0) + num
Answered By: Sayan Maity

A solution to shorten the condition can be the following sample:

dict = {}
dict['1'] = 10
dict['1'] = dict.get('1', 0) + 1 if '1' in dict else 1
print(dict)
Answered By: MiladKoohi
Categories: questions Tags: , ,
Answers are sorted by their score. The answer accepted by the question owner as the best is marked with
at the top-right corner.