Сокращение дубликатов в списке списков Python - PullRequest
0 голосов
/ 28 февраля 2012

Я пишу программу, которая читает несколько файлов, а затем индексирует термины в них. Я могу читать файлы в 2d массив (список) в Python, но затем мне нужно удалить дубликаты в первом столбце и сохранить индекс в новом столбце с первым появлением дублированного слова.

Например:

['when', 1]
['yes', 1]
['', 1]
['greg', 1]
['17', 1]
['when',2]

первый столбец - это термин, а второй - DocID, из которого он получен. я хочу иметь возможность изменить это на:

['when', 1, 2]
['yes', 1]
['', 1]
['greg', 1]
['17', 1]

удаление дубликата.

Это то, что я имею до сих пор:

for j in range(0,len(index)):
        for r in range(1,len(index)):
                if index[j][0] == index[r][0]:
                        index[j].append(index[r][1])
                        index.remove(index[r])

я продолжаю получать ошибку вне диапазона в

if index[j][0] == index[r][0]:

и я думаю, что это потому, что я удаляю объект из индекса, поэтому он становится меньше. любые идеи будут высоко ценится (и да, я знаю, что не должен изменять оригинал, но это всего лишь небольшая проверка)

Ответы [ 3 ]

3 голосов
/ 28 февраля 2012

Не будет более подходящим для построения dict / defaultdict?

Что-то вроде:

from collections import defaultdict

ar = [['when', 1],
      ['yes', 1],
      ['', 1],
      ['greg', 1],
      ['17', 1],
      ['when',2]] 

result = defaultdict(list)
for lst in ar:
    result[lst[0]].append(lst[1])

Выход:

>>> for k,v in result.items():
...     print(repr(k),v)
'' [1]
'yes' [1]
'greg' [1]
'when' [1, 2]
'17' [1]
1 голос
/ 28 февраля 2012

Да, ваша ошибка связана с изменением списка на месте. Кроме того, ваше решение будет неэффективным для длинных списков. Вместо этого лучше использовать словарь и в конце преобразовать его в список:

from collections import defaultdict
od = defaultdict(list)

for term, doc_id in index:
    od[term].append(doc_id)

result = [[term] + doc_ids for term, doc_ids in od.iteritems()]

print result
# [['', 1], ['yes', 1], ['greg', 1], ['when', 1, 2], ['17', 1]]
0 голосов
/ 28 февраля 2012

На самом деле, вы могли бы сделать это, используя range() и len(). Однако прелесть python в том, что вы можете напрямую итерировать элементы в списке без индексов

Посмотрите вокруг этого кода и попытайтесь понять.

#!/usr/bin/env python

def main():

    tot_array = \
    [ ['when', 1],
      ['yes', 1],
      ['', 1],
      ['greg', 1],
      ['17', 1],
      ['when',2]
    ]

    for aList1 in tot_array:
        for aList2 in tot_array:
            if aList1[0]==aList2[0] and aList1 !=aList2:
                aList1.append(aList2[1])
                tot_array.remove(aList2)
    print tot_array

    pass

if __name__ == '__main__':
    main()

Вывод будет выглядеть так:

*** Remote Interpreter Reinitialized  ***
>>> 
[['when', 1, 2], ['yes', 1], ['', 1], ['greg', 1], ['17', 1]]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...