Как мне найти дубликаты в списке и создать еще один список с ними? - PullRequest
357 голосов
/ 23 марта 2012

Как я могу найти дубликаты в списке Python и создать другой список дубликатов? Список содержит только целые числа.

Ответы [ 28 ]

1 голос
/ 11 июля 2015

Однолинейное решение:

set([i for i in list if sum([1 for a in list if a == i]) > 1])
1 голос
/ 11 марта 2016

Здесь есть много ответов, но я думаю, что это относительно очень читаемый и простой для понимания подход:

def get_duplicates(sorted_list):
    duplicates = []
    last = sorted_list[0]
    for x in sorted_list[1:]:
        if x == last:
            duplicates.append(x)
        last = x
    return set(duplicates)

Примечания:

  • Если вы хотитечтобы сохранить количество дубликатов, избавьтесь от приведенного в нижней части набора, чтобы получить полный список
  • Если вы предпочитаете использовать генераторы, замените duplicates.append (x) на yield x и оператор возврата внизу (вы можете привести к установке позже)
1 голос
/ 24 мая 2016

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

Для списков со всеми элементами, которые имеют тип hashable:

def gen_dupes(array):
    unique = {}
    for value in array:
        if value in unique and unique[value]:
            unique[value] = False
            yield value
        else:
            unique[value] = True

array = [1, 2, 2, 3, 4, 1, 5, 2, 6, 6]
print(list(gen_dupes(array)))
# => [2, 1, 6]

Для списков, которые могут содержать списки:

def gen_dupes(array):
    unique = {}
    for value in array:
        is_list = False
        if type(value) is list:
            value = tuple(value)
            is_list = True

        if value in unique and unique[value]:
            unique[value] = False
            if is_list:
                value = list(value)

            yield value
        else:
            unique[value] = True

array = [1, 2, 2, [1, 2], 3, 4, [1, 2], 5, 2, 6, 6]
print(list(gen_dupes(array)))
# => [2, [1, 2], 6]
0 голосов
/ 11 мая 2019

использование метода list.count() в списке для обнаружения дублирующих элементов данного списка

arr=[]
dup =[]
for i in range(int(input("Enter range of list: "))):
    arr.append(int(input("Enter Element in a list: ")))
for i in arr:
    if arr.count(i)>1 and i not in dup:
        dup.append(i)
print(dup)
0 голосов
/ 06 октября 2018

Я вступаю намного позже в это обсуждение. Хотя я бы хотел решить эту проблему с одним вкладышем. Потому что это прелесть Python. если мы просто хотим поместить дубликаты в отдельный список (или любую коллекцию), я бы предложил сделать это следующим образом. Скажем, у нас есть дублированный список, который мы можем назвать «target»

    target=[1,2,3,4,4,4,3,5,6,8,4,3]

Теперь, если мы хотим получить дубликаты, мы можем использовать один вкладыш, как показано ниже:

    duplicates=dict(set((x,target.count(x)) for x in filter(lambda rec : target.count(rec)>1,target)))

Этот код будет помещать дублированные записи в качестве ключа и считать как значение в словарь «дубликаты». «Дубликат» словарь будет выглядеть следующим образом:

    {3: 3, 4: 4} #it saying 3 is repeated 3 times and 4 is 4 times

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

    duplicates=filter(lambda rec : target.count(rec)>1,target)

Вывод будет:

    [3, 4, 4, 4, 3, 4, 3]

Это прекрасно работает в python 2.7.x + версии

0 голосов
/ 25 июля 2018

При использовании toolz :

from toolz import frequencies, valfilter

a = [1,2,2,3,4,5,4]
>>> list(valfilter(lambda count: count > 1, frequencies(a)).keys())
[2,4] 
0 голосов
/ 05 февраля 2016

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

def dupList(oldlist):
    if type(oldlist)==type((2,2)):
        oldlist=[x for x in oldlist]
    newList=[]
    newList=newList+oldlist
    oldlist=oldlist
    forbidden=[]
    checkPoint=0
    for i in range(len(oldlist)):
        #print 'start i', i
        if i in forbidden:
            continue
        else:
            for j in range(len(oldlist)):
                #print 'start j', j
                if j in forbidden:
                    continue
                else:
                    #print 'after Else'
                    if i!=j: 
                        #print 'i,j', i,j
                        #print oldlist
                        #print newList
                        if oldlist[j]==oldlist[i]:
                            #print 'oldlist[i],oldlist[j]', oldlist[i],oldlist[j]
                            forbidden.append(j)
                            #print 'forbidden', forbidden
                            del newList[j-checkPoint]
                            #print newList
                            checkPoint=checkPoint+1
    return newList

, поэтому ваш пример работает как:

>>>a = [1,2,3,3,3,4,5,6,6,7]
>>>dupList(a)
[1, 2, 3, 4, 5, 6, 7]
0 голосов
/ 10 февраля 2016

Используйте функцию sort(). Дубликаты могут быть идентифицированы путем циклического повторения и проверки l1[i] == l1[i+1].

...