0

私はブール検索プロジェクトを行っています。最初のフェーズはインデックス作成です。現在、逆索引を作成しようとしています。次のようなソートされたリストを取得したとします。アイテムをマージするにはどうすればよいですか

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
4

1 に答える 1

1

次のように実行できます。

>>> 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

于 2013-03-03T02:58:37.677 に答える