私はブール検索プロジェクトを行っています。最初のフェーズはインデックス作成です。現在、逆索引を作成しようとしています。次のようなソートされたリストを取得したとします。アイテムをマージするにはどうすればよいですか
list = [('a',1),('a',2),('a',3),('b',1),('b',2),('b',3)...]
次のような辞書を取得でき、ソートされたままになります。
dict = {'a':[1,2,3], 'b':[1,2,3]...}, thx a lot
次のように実行できます。
>>> import collections
>>> mylist = [('a',1),('a',2),('a',3),('b',1),('b',2),('b',3)]
>>> result = collections.defaultdict(list)
>>> for item in mylist:
result[item[0]].append(item[1])
>>> dict(result)
{'a': [1, 2, 3], 'b': [1, 2, 3]}
defaultdict(list)
引数として渡された callable (この場合は ) を使用して作成されたオブジェクトへの最初のアクセス時にキーが初期化されるディクショナリを作成しますlist
。キーが既に存在するかどうかを確認する必要がなくなります。
最後の行は、 を通常の辞書に変換しdefaultdict
ます。通常の辞書のようdict
に動作するため、厳密には必要ありませdefaultdict
ん。
値は、元のリストと同じ順序で各キーに追加されます。ただし、キー自体は順序付けされません (これは辞書のプロパティです)。
更新:辞書キーもソートしたままにする必要がある場合は、これを行うことができます:
>>> import collections
>>> mylist = [('a',1),('a',2),('c',1),('c',2),('b',1),('b',2)]
>>> result = collections.OrderedDict()
>>> for item in mylist:
if item[0] not in result:
result[item[0]] = list()
result[item[0]].append(item[1])
>>> result
OrderedDict([('a', [1, 2]), ('c', [1, 2]), ('b', [1, 2])])
>>> result.keys()
['a', 'c', 'b']
明らかに、特定のキー順序を維持しないためdict(result)
、この場合は使用できません。dict