2017-01-13 2 views
-1

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

значения: [1, 3, 0, 1, 4, 1, 1, 2, 2, 5, 4, 3, 1, 3, 3, 4, 2, 4, 3, 1, 3, 0, 3, 0, 0]

Чистота: [5, 2, 4, 1, 3, 0]

мне нужно [1, 2, 0, 4, 5, 3] как "чистый" список

def remove_duplicates(lst) 
i = len(lst) 
while i>0: 
    while values.count(values[i]>1: 
    values.remove(values[i]) 
    i-=1 
    i-=1 
return 

вопрос кажется довольно простым для решения с циклами и вывода нового списка, но я должен использовать их в циклах и придерживаться только одного списка.

def remove_duplicates(lst): 
new =[] 
for x in lst: 
    if x not in lst: 
    new.append(x) 
return new 
+3

Как вы получили нужный список как '[1, 2, 0, 4, 5, 3]'? Я не вижу никакой логики. По крайней мере, этот список не основан на первом вхождении числа или в последнем случае. Пожалуйста, объясните логику –

+0

@Miryloth. Ваш выход не имеет смысла. Если вы должны были взять первый экземпляр каждого номера в своем списке, вы получите '[1,3,0,4,2,5]', но вы говорите, что это должно быть '[1, 2, 0, 4, 5 , 3] '? –

+0

Возможный дубликат [Как удалить дубликаты из списка при сохранении порядка?] (Http://stackoverflow.com/questions/480214/how-do-you-remove-duplicates-from-a-list-in- пока сохраняющий порядок) –

ответ

1
def remove_duplicates(lst): 
    i = 0 
    while i < len(lst): 
     j = i + 1 
     while j < len(lst): # check for duplicates of lst[i] and remove them 
      if lst[i] == lst[j]: 
       del lst[j] 
      else: 
       j += 1 # only increment second idx if the item is not removed! 
     i += 1 
    return 

и тестирования: (!, Который определенно быстрее, но я не уверен, если это разрешено)

>>> lst = [1, 3, 0, 1, 4, 1, 1, 2, 2, 5, 4, 3, 1, 3, 3, 4, 2, 4, 3, 1, 3, 0, 3, 0, 0] 
>>> remove_duplicates(lst) 
>>> lst 
[1, 3, 0, 4, 2, 5] 

Вы также можете реализовать его с set вместо второго цикла в то время как :

def remove_duplicates(lst): 
    i = 0 
    found = set() 
    while i < len(lst): 
     if lst[i] in found: 
      del lst[i] 
     else: 
      found.add(lst[i]) 
      i += 1 
    return 

Ju е быстрое примечание о том, почему вы подход не может работать, можно найти в документации list.remove:

list.remove (х)

Удалить первый элемент из списка, значение которого равно х , Это ошибка, если такой элемент отсутствует.

Но вы хотите удалить все вхождения, кроме первого!

Смежные вопросы