Список удаления дубликатов? - PullRequest
0 голосов
/ 31 августа 2018

Я написал код, который удаляет дубликаты из списка в Python. Вот оно:

List = [4, 2, 3, 1, 7, 4, 5, 6, 5]
NewList = []

for i in List:
    if List[i] not in NewList:
        NewList.append(i)

print ("Original List:", List)
print ("Reworked List:", NewList)

Однако вывод:

Original List: [4, 2, 3, 1, 7, 4, 5, 6, 5]
Reworked List: [4, 2, 3, 7, 6]

Почему 1 отсутствует на выходе?

Ответы [ 4 ]

0 голосов
/ 31 августа 2018

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

У вас есть несколько вариантов:

# 1 Перебирать элементы напрямую

Используйте элементы списка при их непосредственном итерировании:

NewList = []
for el in L:
    if el not in NewList:
        NewList.append(i)

# 2 Перебрать индекс списка

Это часто считается анти-паттерном, но не является недействительным. Вы можете перебирать диапазон размера списка, а затем использовать индексирование списка:

NewList = []
for idx in range(len(L)):
    if L[idx] not in NewList:
        NewList.append(i)

В обоих случаях обратите внимание, как мы избегаем именования переменных после встроенных модулей. Не используйте list или List, вместо этого вы можете использовать L.

# 3 unique_everseen

Более эффективно реализовать хеширование для сложности поиска O (1). В документах itertools есть unique_everseen рецепт , тиражированный в сторонних организациях toolz.unique. Это работает с использованием seen набора и отслеживания элементов во время итерации.

from toolz import unique

NewList = list(unique(L))
0 голосов
/ 31 августа 2018

Использование set() убивает ордер. Вы можете попробовать это:

>>> from collections import OrderedDict
>>> NewList = list(OrderedDict.fromkeys(List))
0 голосов
/ 31 августа 2018

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

for i in List:  # 1
    if List[i]  # 2
  1. Здесь вы используете i для представления элементов внутри списка: 4, 2, 3, ...
  2. Здесь вы используете i для представления индексов Списка: 0, 1, 2, ...

Очевидно, 1. и 2. не совместимы. Короче говоря, ваша проверка выполняется для элемента, отличного от того, который вы указали в своем списке.

Это можно исправить, последовательно обработав i на обоих шагах:

for i in List:
    if i not in NewList:
         NewList.append(i)
0 голосов
/ 31 августа 2018

Вы не поняли, как работают циклы в python. Если вы напишите for i in List:, у меня будут значения из списка одно за другим, так что в вашем случае 4, 2, 3 ...

Полагаю, вы думали, что это будет счет.

У вас есть несколько различных способов удаления дубликатов из списков в Python, которые вам не нужно писать самостоятельно, например, преобразование их в набор и обратно в список.

list(set(List))

Также вы должны прочитать Pep8 и назвать ваши переменные по-разному, но это только кстати.

Также, если вы действительно хотите цикл с индексами, вы можете использовать перечисление в python.

for idx, value in enumerate(myList):
    print(idx)
    print(myList[idx])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...