我正在做一个布尔检索项目,第一阶段是索引。我现在正在尝试建立一个倒排索引。假设我有一个排序列表,如下所示:如何合并项目
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)
创建一个字典,其中键在第一次访问使用作为参数传递的可调用对象创建的对象时被初始化(在本例中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
它不维护任何特定的键顺序。