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?
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?
An alternative is:
my_dict[key] = my_dict.get(key, 0) + num
dict
doesn't provide a way to access multiple elements in a single expression I don't see how. –
Thundershower 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})
lambda: 0
, you can just say, int
. –
Meingoldas Counter
also supports the default 0 functionality. I have been using Nicola's solution until now, but it's much nicer without it. –
Inessential What you want is called a defaultdict
See http://docs.python.org/library/collections.html#collections.defaultdict
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
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.
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
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)
dict
is the build-in name of dictionaries. The answer is functunally equivalent to the already accepted one with an unneccessary inline if function. –
Cotterell © 2022 - 2024 — McMap. All rights reserved.