We have all learnt how to retrieve a key from a dict. We use the [] indexing operator to look up the value.

a = {"name": "Siddharta", "country": "India"}

But did you know that there is another way to get data from a dictionary? Yes, dicts have a get method that can be used to also retrieve the value of a key. Check it out

a = {"name": "Siddharta", "country": "India"}

Both return the same output. So why does the dict have this get method?

Well, it turns out that get has a superpower that the regular indexing does not. It takes in a second parameter where you can specify a default value. If the key is not present in the dictionary, then the method will return this default value. (If no default value is specified it will return None)

a = {"name": "Siddharta", "country": "India"}
print(a.get("name", "Unknown")) # prints Siddharta
print(a.get("city", "Unknown")) # prints Unknown

In the example above, the dict has a name key, so the first line will return the corresponding value Siddharta which will be printed out. The dict does not have a city key, so it will return parameter 2 which contains the default value. Since we set the default value to Unknown that will be returned in this case. Note that get does not give an error when the key is missing, unlike [].

Back to the word count problem

How do we apply this bit of knowledge to the word count problem?

Recall what we need to do

You want to loop through the words and keep track of the count in a dictionary–if the word is already present in the dictionary then increment its count, otherwise add it to the dictionary with a count of one.

You can do that with a single line of code using get

counts[word] = counts.get(word, 0) + 1

If the word exists in the dictionary, then it will retrieve the current count and increment it. If the word is not in the dictionary, it will return zero (the default value specified), then add one and add it to the dictionary.

This is what the full code would look like

def count_words(line):
    words = line.split()
    counts = {}
    for word in words:
        counts[word] = counts.get(word, 0) + 1
    return counts

Isn't that beautiful?

But there is a way to make it even more beautiful. That's in the next article.

Did you like this article?

If you liked this article, consider subscribing to this site. Subscribing is free.

Why subscribe? Here are three reasons:

  1. You will get every new article as an email in your inbox, so you never miss an article
  2. You will be able to comment on all the posts, ask questions, etc
  3. Once in a while, I will be posting conference talk slides, longer form articles (such as this one), and other content as subscriber-only