2013-03-03 3 views
0

Я занимаюсь булевым поисковым проектом, первая фаза - индексированием. Сейчас я пытаюсь создать инвертированный индекс. Скажем, у меня есть отсортированный список, как следующее: как я могу объединить элементыboolean retrieval, indexing phase

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 ведет себя как обычный словарь.

Значения прилагаются к каждой клавише в том же порядке, что и исходный список. Однако сами ключи не будут упорядочены (это свойство словарей).


Update: если вам нужны ключи словаря оставаться отсортирован, а также, вы можете сделать это:

>>> 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), ("'s", 10), (' (', 5), (' (6), (')', 5), (')', 6), ('+ bahia', 1), (',', 1), (',', 5), (',' , 6), (',', 9), (',', 10), ('-', 5), ('-', 5), ('.', 1), ('.', 5), ('.', 6), ('.', 9), ('.', 10), ('.125', 10), ('0,39', 1), ('0,99', 5), ('1', 9), ('1,655,8', 6), ('1750', 1), ('1780', 1), ('1850', 1), ('1870', 1) ('1,875', 1), ('1,880', 1), ('1,06', 1), ('1.24', 5)] – xlk3099

+0

ах, вы хотите, чтобы словарные ключи оставались отсортированными? Обновит ответ тогда ... – isedev

+0

это действительно приятно, thx много :). – xlk3099