When I am reading a realpython article Working With JSON Data in Python, I find an interesting python technique that reminds me something else I read before. It is called Counting With Dictionary by Raymond Hettinger in a python talk. A previous blog post has the links to the video and the note.
Given a list such as colors below,
colors = ['red', 'green', 'red', 'blue', 'green', 'red']
the python code should generate a dictionary. The keys of the dictionary are
values in the list, and the values of the dictionary are the corresponding number of
keys in the list. For the above example, the result dictionary d
is
{'red': 3, 'green': 2, 'blue': 1}
There are many ways to write the code. I will summarize these techniques below.
The basic way is to set the d[color] to 0 when the dictionary sees the color first time. Total line count is 5.
d = {}
for color in colors:
if color not in d:
d[color] = 0
d[color] += 1
You can make slight changes to the code above, but the logic is the same. It will have one more line.
d = {}
for color in colors:
if color not in d:
d[color] = 1
else:
d[color] += 1
If the color is not in the dictionary, using d[color]
to access its value raises
a KeyValue exception. The dictionary get
method returns the second argument
when the first argument is not already in the dictionary. Line count is 3.
d = {}
for color in colors:
d[color] = d.get(color, 0) + 1
The standard collections package has a defaultdict class. The class sets a default value for a key. Line count is still 5.
from collections import defaultdict
d = defaultdict(int)
for color in colors:
d[color] += 1
d = dict(d)
The above three methods are from Raymond Hettinger’s python talk. The method below is from the Real Python article I introduced earlier. This method takes 6 lines, but the logic is very clear.
d ={}
for color in colors:
try:
d[color] += 1
except KeyError:
d[color] = 1
This method is between the first two methods. Line count is also between 5 and 3.
This method uses dictionary method setdefault
, which is also discussed in
Raymond Hettinger’s python talk.
d={}
for color in colors:
d.setdefault(color, 0)
d[color] +=1
Python is very flexible to write once you know the basics, and there are always many ways to solve a problem.
When I am browsing collections
module
documentation on python.org,
I find a Counter
class which is “a counter tool provided to support convenient
and rapid tallies”.
from collections import Counter
cnt = Counter(colors)
d = dict(cnt)
This method is probably the easiest and the line count is only 3.