布尔检索,索引阶段

时间:2013-03-03 02:43:18

标签: python indexing

我正在做一个布尔检索项目,第一阶段是索引。我正在尝试建立一个倒排索引。假设我有一个排序列表,如下所示:我如何合并项目

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

1 个答案:

答案 0 :(得分: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没有维护任何特定的密钥顺序。