我正在做一个布尔检索项目,第一阶段是索引。我正在尝试建立一个倒排索引。假设我有一个排序列表,如下所示:我如何合并项目
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
答案 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
没有维护任何特定的密钥顺序。