2013-03-03 68 views
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 

回答

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)创建其中键在第一接入初始化到对象字典使用作为参数传递的调用(在这种情况下创建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不保持任何特定的按键顺序。

+0

thx为您的答复,其实我已经知道这种方法,我刚才给的样品并不是那么正确。尝试此示例,并检查字典是否仍然排序列表= [('&',9),(''',10),('(',5),('( ('''',5),('''',5),('''',6),('+ bahia',1), (''',5),('。',1),('。',9),(',',10), ('。',9),('。',10),('.125',10),('0.39',1),('0.99',5) ),('1',9),('1,655.8',6),('1,750',1),('1,780',1),('1,850',1),('1,870',1), ('1,875',1),('1,880',1),('1.06',1),('1.24',5)] – xlk3099 2013-03-03 03:10:14

+0

啊,你想让字典键保持排序吗?将更新答案,然后... – isedev 2013-03-03 03:13:48

+0

这真的很不错,thx很多:)。 – xlk3099 2013-03-03 03:25:41