辞書のgetとsetdefault

辞書に存在しないキーを普通に[]で参照するとKeyErrorになります。

>>> d = {}
>>> d['foo']
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
KeyError: 'foo'

d.get()を使うと、キーが存在しない場合に返却するデフォルト値を指定できます。が、dの中自体は変更しません。
d.setdefault()を使うと、キーが存在しない場合はデフォルト値を返却し、かつdの中も変更してくれます。

>>> d.get('foo', 'bar')
'bar'
>>> d
{}
>>> d.setdefault('foo', 'bar')
'bar'
>>> d
{'foo': 'bar'}

前に気になっていた

        if not statetab.has_key((w1, w2)):
            statetab[(w1, w2)] = []
        statetab[(w1, w2)].append(word)

というコードは

        statetab.setdefault((w1, w2), []).append(word)

と書き直せますね。