Python: The Dictionary Playbook

Python: The Dictionary Playbook

I so often come across various kinds of boilerplate code regarding dictionaries in Python, that I decided to show some of it here and share the more concise way of performing the same operations. Presenting: The Dictionary Playbook.

1. The “Are You There?”

This one is pretty simple, but I’m amazed as to how it’s missed – finding out if a key exists in the dictionary.

The Lame Version
1
dct.has_key(key)
The Python Way
1
key in dct

2. The “Yoda Test”

For those programmers who master the “Are You There” play, there’s usually another simple, yet annoying behavior. It doesn’t only apply to dicts, but it’s very common.

Do This You Must Not
1
not key in dct
English, Do You Speak It?
1
key not in dct

3. The “Get the Value Anyway”

This one is really popular. You have a dictionary and a key, and you want to modify the key’s value. For example, adding 1 to it (let’s say you’re counting something).

The Boilerplate
1
2
3
if key not in dct:
    dct[key] = 0
dct[key] = dct[key] + 1
The Awesome Way
1
dct[key] = dct.get(key, 0) + 1

dct.get(key[, default]) returns dct[key] if it exists, and default if not.

The Even More Awesome

If you’re using Python 2.7 and you want to count up amounts of stuff, you can use Counter.

1
2
3
4
>>> from collections import Counter
>>> d = [1, 1, 1, 2, 2, 3, 1, 1]
>>> Counter(d)
Counter({1: 5, 2: 2, 3: 1})

And here’s a more complete example:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
>>> counter = Counter()
... for _ in range(10):
...     num = int(raw_input("Enter a number: "))
...     counter.update([num]) 
...
... for key, value in counter.iteritems():
...     print "You have entered {}, {} times!".format(key, value) 
Enter a number: 1
Enter a number: 1
Enter a number: 2
Enter a number: 3
Enter a number: 51
Enter a number: 1
Enter a number: 1
Enter a number: 1
Enter a number: 2
Enter a number: 3
You have entered 1, 5 times!
You have entered 2, 2 times!
You have entered 3, 2 times!
You have entered 51, 1 times!

4. The “Make It Happen”

Sometimes your dictionary contains mutable objects, and you want to initialize and modify them. Let’s say you’re sorting out some data into a dictionary where the values are lists (examples courtesy of this answer in Stack Overflow).

Spelling It Out
1
2
3
4
5
6
dct = {}
for (key, value) in data:     
    if key in dct:         
        dct[key].append(value)     
    else:         
        dct[key] = [value]
Getting Down with the Python
1
2
3
4
dct = {}
for (key, value) in data:    
    group = dct.setdefault(key, []) # key might exist already     
    group.append(value)

What setdefault(key, default) does is returns dct[key] if it exists, and if it doesn’t – sets it to default and returns it. Compared to get, it’s useful when the default value is an object you can modify, so you don’t have to manually reinsert its modified version to the dictionary.

Rocking it Out
1
2
3
dct = defaultdict(list)
for (key, value) in data:     
    dct[key].append(value) # all keys have a default already

defaultdict is pretty awesome. It’s pretty self-explanatory – it’s a dict with default values. This means that every access to a key in dct that doesn’t exist in the dictionary (that would usually raise a KeyError) creates it with the default value. It’s as if every access to dct is done with setdefault.

One interesting use I’ve found for defaultdict is when implementing sparse data structures. You set defaultdict to the default value and use coordinates (or whatever is applicable) as the key. I’ve used this to represents multi-dimensional grids and it’s definitely easier than using intricately wrapped lists. 

An even more interesting example of its use is the one-line tree definition.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值