Подтвердить что ты не робот

Python: как удалить все повторяющиеся элементы из списка

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

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

for i in lseparatedOrbList:
   for j in lseparatedOrblist:
        if lseparatedOrbList[i] == lseparatedOrbList[j]:
            lseparatedOrbList.remove(lseparatedOrbList[j])

Но я получаю ошибку:

Traceback (most recent call last):
  File "qchemOutputSearch.py", line 123, in <module>
    for j in lseparatedOrblist:
NameError: name 'lseparatedOrblist' is not defined

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

4b9b3361

Ответ 1

Просто введите новый список, если элемент для вашего списка еще не введен в новый список, иначе просто перейдите к следующему элементу в вашем исходном списке.

for i in mylist:
  if i not in newlist:
    newlist.append(i)

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

Ответ 2

Используйте set():

woduplicates = set(lseparatedOrblist)

Возвращает набор без дубликатов. Если вам по какой-то причине нужен список назад:

woduplicates = list(set(lseperatedOrblist))

Ответ 3

Вы можете сделать это следующим образом:

x = list(set(x))

Пример: если вы сделаете что-то вроде этого:

x = [1,2,3,4,5,6,7,8,9,10,2,1,6,31,20]
x = list(set(x))
x

вы увидите следующий результат:

[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 20, 31]

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

Ответ 4

Это должно быть быстрее и сохранить исходный порядок:

seen = {}
new_list = [seen.setdefault(x, x) for x in my_list if x not in seen]

Если вам не нужен порядок, вы можете просто:

new_list = list(set(my_list))

Ответ 5

Это должно сделать это за вас:

new_list = list(set(old_list))

set автоматически удалит дубликаты. list вернет его в список.

Ответ 6

Нет, это просто опечатка, "список" в конце должен быть капитализирован. Вы можете вложить петли по одной и той же переменной просто отлично (хотя редко есть веские причины).

Однако есть и другие проблемы с кодом. Для начала вы повторяете списки, поэтому i и j будут элементами, а не индексами. Кроме того, вы не можете изменить коллекцию, итерации по ней (ну, вы "можете" в том, что она работает, но безумие лежит именно так, например, вы сможете пропустить предметы). И тогда возникает проблема сложности, ваш код O (n ^ 2). Либо преобразуйте список в set, либо обратно в list (просто, но перетасовывайте остальные элементы списка) или выполните что-то вроде этого:

seen = set()
new_x = []
for x in xs:
    if x in seen:
        continue
    seen.add(x)
    new_xs.append(x)

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

Ответ 7

Это потому, что на самом деле отсутствует прописная буква.

Целенаправленно:

for i in lseparatedOrbList:   # capital 'L'
for j in lseparatedOrblist:   # lowercase 'l'

Хотя более эффективным способом сделать это было бы вставить содержимое в set.

Если поддерживается порядок списка (т.е. он должен быть "стабильным" ), проверить ответы на этот вопрос

Ответ 8

Использовать набор

return list(set(result))

Использовать dict

return dict.fromkeys(result).keys()

Ответ 9

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

def purge_dublicates(X):
    unique_X = []
    for i, row in enumerate(X):
        if row not in X[i + 1:]:
            unique_X.append(row)
    return unique_X

Ответ 10

Самый простой способ - использовать функцию set():

new_list = list(set(your_list))

Ответ 11

Современный способ сделать это, который поддерживает порядок:

>>> from collections import OrderedDict
>>> list(OrderedDict.fromkeys(lseparatedOrbList))

как обсуждал Раймонд Хеттингер (python core dev) в этом ответе. Однако ключи должны быть хешируемыми (как это имеет место в вашем списке, я думаю)

Ответ 12

Существует более быстрый способ исправить это:

list = [1, 1.0, 1.41, 1.73, 2, 2, 2.0, 2.24, 3, 3, 4, 4, 4, 5, 6, 6, 8, 8, 9, 10]
list2=[]

for value in list:
    try:
        list2.index(value)
    except:
        list2.append(value)
list.clear()
for value in list2:
    list.append(value)
list2.clear()
print(list)
print(list2)

Ответ 13

Таким образом можно удалить определенный элемент, который присутствует несколько раз в списке: Попробуйте удалить все 5

list1=[1,2,3,4,5,6,5,3,5,7,11,5,9,8,121,98,67,34,5,21]
print list1
n=input("item to be deleted : " )
for i in list1:
    if n in list1:
        list1.remove(n)
print list1