2015-03-02 6 views
2

Я пытаюсь написать программу, которая удаляет дубликаты из списка, но моя программа продолжает вызывать ошибку «индекс индекса вне диапазона» в строке 5, if n/(sequence[k]) == 1:. Я не могу понять это. Правильно ли я полагаю, что возможные значения «k» равны 0, 1 и 2? Как «последовательность» с любым из них является индексом за пределами возможного диапазона индексов?Удалить дубликаты из списка python

def remove_duplicates(sequence): 
    new_list = sequence 
    for n in sequence: 
     for k in range(len(sequence)): 
      if n/(sequence[k]) == 1: 
       new_list.remove(sequence[k]) 
    print new_list 

remove_duplicates([1,2,3]) 
+3

Почему бы не просто «list (set (your_list))'? – Akavall

+2

Дубликат http://stackoverflow.com/questions/7961363/python-removing-duplicates-in-lists – taesu

ответ

3

я настоятельно рекомендую ответ Akavall в:

list(set(your_list)) 

почему вы выйти ошибок диапазона: Python проходит по ссылке, то есть последовательность и new_list все еще указывают на то же место памяти. Изменение new_list также изменяет последовательность.

И, наконец, вы сравниваете предметы с собой, а затем удаляете их. Так что в принципе, даже если вы использовали копию последовательности, как:

new_list = list(sequence) 

или

new_list = sequence[:] 

Было бы вернуть пустой список.

3

Ваша ошибка одновременно модификация списка:

for k in range(len(sequence)): 
    if n/(sequence[k]) == 1: 
     new_list.remove(sequence[k]) 

Может показаться, убрав из new_list не должно повлиять на последовательность, но вы сделали new_list = sequence в начале функции. Это означает, что new_list на самом деле буквально является последовательностью, возможно, вы имели в виду new_list=list(sequence), чтобы скопировать список?

Если вы признаете, что это тот же список, ошибка очевидна. При удалении элементов изменяется длина и индексы.

P.S. Как уже отмечалось в комментарии по @Akavall, все, что вам нужно:

sequence=list(set(sequence)) 

Для того, чтобы последовательность не содержат простофили. Другой вариант, если вам нужно сохранить порядок, является:

from collections import OrderedDict 
sequence=list(OrderedDict.fromkeys(sequence)) 
+0

О, спасибо. Но я до сих пор не понимаю. Разве я не изменяю 'new_list', а не 'sequence'? – Crytera

+0

@ Crytera извините, это было просто, например, я исправил его сейчас, если вы хотите принять ответ. – Others

+0

спасибо за совет, но я хотел узнать больше, почему ошибка была выброшена, если я не изменяю «последовательность». – Crytera

0
# like @Akavall suggested 
def remove_duplicates(sequence): 
    # returns unsorted unique list 
    return list(set(sequence)) 

# create a list, if ele from input not in that list, append. 
def remove_duplicates(sequence): 
    lst = [] 
    for i in sequence: 
     if i not in lst: 
      lst.append(i) 
    # returns unsorted unique list 
    return lst 
+1

"return list (set (sequence))" не обязательно сортирует элементы ... – Others

+0

Вы правы. Ред. – taesu

1

Если вам не нравится list(set(your_list)), потому что это не гарантированно сохранившегося заказ, вы можете захватить the OrderedSet recipe, а затем сделать:

from ordered_set import OrderedSet 

foo = list("face a dead cabbage") 
print foo 
print list(set(foo)) # Order might change 
print list(OrderedSet(foo)) # Order preserved 
Смежные вопросы