2016-10-26 4 views
1

Я пытаюсь вручную создать функцию, которая удаляет дубликаты из списка. Я знаю, что есть функция Python, которая делает что-то подобное (set()), но я хочу создать свою собственную. Это то, что у меня есть:Создание функции, которая удаляет дубликаты в списке

def remove(lst): 

for i in range(len(lst)): 
    aux = lst[0:i] + lst[i+1:len(lst)] 
    if lst[i] in aux: 
     del(lst[i]) 

return lst 

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

Проблема заключается в том, что она дает мне индекс за пределами допустимой погрешности. Ли линия for i in range(len(lst)): не обновляется каждый раз, когда она начинается? Поскольку я удаляю элементы из списка, список будет короче, поэтому для списка, который содержит 10 элементов и 2 дубликата, он будет расти до индекса 9 вместо остановки 7-го.

Есть ли все равно, чтобы исправить это, или я просто попытаюсь сделать это, это другой способ?

+0

Вы можете хранить все индексы элементов, которые необходимо удалить, а затем обрабатывать все после цикла. – JETM

+0

* Должен ли я просто попробовать сделать это другим способом? * <--- да, что – wim

+0

Как? Я попытался это сделать, но как только я делаю del (lst [d]) d - список со всеми дублирующими индексами, он дает мне ошибку из диапазона, поскольку все остальные значения d теперь выключены. – Myntekt

ответ

1

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

+0

Да, это точная проблема, я буду придерживаться того, о чем упомянул еще один пользователь! благодаря – Myntekt

1

Я знаю, что это не исправляет ваш текущий скрипт, но что-то вроде этой работы?

def remove(lst): 
    unique=[] 
    for i in lst: 
     if i not in unique: unique.append(i) 
    return unique 

Просто прошивка, создание другого списка и проверка членства?

0

Вы получили его в первый раз: len (lst) оценивается только при вводе цикла. Если вы хотите повторно оценили, попробуйте версию то время как:

i = 0 
while i < len(lst): 
    ... 
    i += 1 

Далее, вы получите беспокоиться о другой проблеме: вы увеличиваете я только когда вы не удалить элемент. Когда вы удаляете, сокращение списка приведет вас к следующему элементу.

i = 0 
while i < len(lst): 
    aux = lst[0:i] + lst[i+1:len(lst)] 
    if lst[i] in aux: 
     del(lst[i]) 
    else: 
     i += 1 

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

0
def remove(lst): 
    new_list = [] 
    for i in lst: 
     if i not in new_list: 
      new_list.append(i) 
    return new_list 

Вы должны добавить значения во вторичный список. Как Bobbyrogers said, это нехорошая идея перебирать список, который меняется.

0

Вы также можете попробовать это:

lst = [1,2,3,3,4,4,5,6] 
lst2 = [] 
for i in lst: 
    if i not in lst2: 
     lst2.append(i) 
print(lst2) 
[1, 2, 3, 4, 5, 6] 
Смежные вопросы