Удалить повторяющиеся записи в списке с помощью Python - PullRequest
1 голос
/ 02 марта 2012

У меня есть большой файл с записями, открытыми в python как:

 fh_in=open('/xzy/abc', 'r') 
 parsed_in=csv.reader(fh_in, delimiter=',')
 for element in parsed_in:
  print(element)

РЕЗУЛЬТАТ:

['ABC', 'chr9', '3468582', 'NAME1','UGA', 'GGU']

['DEF', 'chr9', '14855289', NAME19 ',' UCG ​​',' GUC ']

[' TTC ','chr9 ',' 793946 ',' NAME178 ',' CAG ',' GUC ']

[' ABC ',' chr9 ',' 3468582 ',' NAME272 ',' UGT ',' GCU ']

Мне нужно извлечь только уникальные записи и удалить записи с одинаковыми значениями в col1, col2 и col3.Как и в этом случае, последняя строка совпадает со строкой 1 на основе col1, col2 и col3.

Я пробовал два метода, но не смог:

Метод 1:

outlist=[]

for element in parsed_in:     
  if element[0:3] not in outlist[0:3]:
    outlist.append(element)

Метод 2:

outlist=[]
parsed_list=list(parsed_in)
for element in range(0,len(parsed_list)):
  if parsed_list[element] not in parsed_list[element+1:]:
    outlist.append(parsed_list[element])

Они оба возвращают все записи, а не уникальные записи на основе первых 3 столбцов.

Пожалуйста, предложите мне способ сделать это

AK

Ответы [ 2 ]

3 голосов
/ 02 марта 2012

Вы, вероятно, захотите использовать поиск O (1), чтобы сохранить себе полное сканирование элементов при добавлении, и, как сказал Caol Acain, наборы - это хороший способ сделать это.

То, что вы хотите сделать, это что-то вроде:

outlist=[]
added_keys = set()

for row in parsed_in:
    # We use tuples because they are hashable
    lookup = tuple(row[:3])    
    if lookup not in added_keys:
        outlist.append(row)
        added_keys.add(lookup)

Вы могли бы поочередно использовать словарь, отображающий ключ на строку, но при этом имелось бы предостережение о том, что вы не сохраните порядок ввода, поэтому наличие списка и набора ключей позволит вам сохранить порядок как -файл.

0 голосов
/ 02 марта 2012

Преобразуйте свои списки в наборы!

http://docs.python.org/tutorial/datastructures.html#sets

...