2013-03-03 110 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