IR (情報検索) コミュニティが逆索引と呼ぶものを作成しているようです。その場合、私はあなたが取っている全体的なアプローチに同意しますが、デフォルトの辞書と組み合わせてカウンタークラスを使用することもお勧めします...
counters.form = collections.defaultdict(collections.Counter)
counters.form
圧縮された世界モデルの一種のインデックスとして機能し、観測がないことはエラー (または False) ではなく、単に 0 です。
例としてデータを使用するform
と、次のように逆インデックスを設定します...
#-- Build the example data into the proposed structure...
counters.form['a'].update({'email1':4, 'email2':3})
counters.form['the'].update({'email1':2, 'email3':4})
counters.form['or'].update({'email1':2, 'email3':1}})
ここで、このデータのフォームの頻度を取得するために、2 次元配列のように逆参照します...
print counters.form['a']['email2']
...これは印刷3
され、現在使用している構造と多かれ少なかれ同じです。これら 2 つのアプローチの本当の違いは、観察がない場合です。例えば...
print counters.form['noword']['some-email']
...現在の構造 ( collections.defaultdict(dict)
) を使用すると、 の 'noword' の get はcounters.form
'miss' になり、defaultdict は自動的に新しく構築された空の辞書を に関連付けcounters.form['noword']
ます。ただし、この空の dict に対してキー「some-email」を照会すると、空の dict にはそのようなキーがないKeyError
ため、「some-email」の例外が発生します。
代わりに提案された構造 ( collections.defaultdict(collections.Counter)
) を使用すると、「noword」の get が失敗counters.form
し、newcollections.Counter
がキー「noword」に関連付けられます。その後、カウンターが「some-email」について (2 番目の逆参照で) 照会されると、カウンターは 0 を返します。これは (私が信じている) 望ましい動作です。
他のレシピをいくつか...
#-- Show distinct emails which contain 'someword'
emails = list(counters.form['someword'])
#-- Show tally of all observations of 'someword'
tally = sum(counters.form['someword'].values( ))