Удаление дубликатов в списках - PullRequest
814 голосов
/ 01 ноября 2011

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

def remove_duplicates():
    t = ['a', 'b', 'c', 'd']
    t2 = ['a', 'c', 'd']
    for t in t2:
        t.append(t.remove())
    return t

Ответы [ 45 ]

4 голосов
/ 14 августа 2015

приведенный ниже код прост для удаления дубликата в списке

def remove_duplicates(x):
    a = []
    for i in x:
        if i not in a:
            a.append(i)
    return a

print remove_duplicates([1,2,2,3,3,4])

возвращает [1,2,3,4]

4 голосов
/ 02 сентября 2014

Этот заботится о заказе без особых хлопот (OrderdDict и другие). Вероятно, не самый Pythonic способ, ни кратчайший путь, но делает трюк:

def remove_duplicates(list):
    ''' Removes duplicate items from a list '''
    singles_list = []
    for element in list:
        if element not in singles_list:
            singles_list.append(element)
    return singles_list
4 голосов
/ 06 октября 2018

Еще один лучший подход может быть,

import pandas as pd

myList = [1, 2, 3, 1, 2, 5, 6, 7, 8]
cleanList = pd.Series(myList).drop_duplicates().tolist()
print(cleanList)

#> [1, 2, 3, 5, 6, 7, 8]

и порядок сохраняется.

4 голосов
/ 29 июля 2017

Использование set :

a = [0,1,2,3,4,3,3,4]
a = list(set(a))
print a

Использование уникально :

import numpy as np
a = [0,1,2,3,4,3,3,4]
a = np.unique(a).tolist()
print a
3 голосов
/ 01 апреля 2017

Вот самое быстрое питоническое решение, по сравнению с другими, перечисленными в ответах.

Использование деталей реализации оценки короткого замыкания позволяет использовать понимание списка, что достаточно быстро. visited.add(item) всегда возвращает None как результат, который оценивается как False, поэтому правая часть or всегда будет результатом такого выражения.

Время сам

def deduplicate(sequence):
    visited = set()
    adder = visited.add  # get rid of qualification overhead
    out = [adder(item) or item for item in sequence if item not in visited]
    return out
3 голосов
/ 20 июня 2018

Очень простой способ в Python 3:

>>> n = [1, 2, 3, 4, 1, 1]
>>> n
[1, 2, 3, 4, 1, 1]
>>> m = sorted(list(set(n)))
>>> m
[1, 2, 3, 4]
2 голосов
/ 29 июля 2017

Я думаю, что преобразование в набор - это самый простой способ удалить дубликаты:

list1 = [1,2,1]
list1 = list(set(list1))
print list1
2 голосов
/ 18 сентября 2018

Вы можете использовать set для удаления дубликатов:

mylist = list(set(mylist))

Но обратите внимание, что результаты будут неупорядоченными.Если это проблема:

mylist.sort()
2 голосов
/ 20 ноября 2015

Установите этот флажок, если хотите удалить дубликаты (редактирование на месте, а не возвращение нового списка) без использования встроенного набора, dict.keys, uniqify, counter

>>> t = [1, 2, 3, 1, 2, 5, 6, 7, 8]
>>> for i in t:
...     if i in t[t.index(i)+1:]:
...         t.remove(i)
... 
>>> t
[3, 1, 2, 5, 6, 7, 8]
2 голосов
/ 29 августа 2018

К сожалению. Большинство ответов здесь либо не сохраняют порядок, либо являются слишком длинными. Вот простой ответ, сохраняющий порядок.

s = [1,2,3,4,5,2,5,6,7,1,3,9,3,5]
x=[]

[x.append(i) for i in s if i not in x]
print(x)

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

...