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

Определить повторяющиеся значения в списке в Python

Можно ли получить, какие значения являются дубликатами в списке, используя python?

У меня есть список элементов:

    mylist = [20, 30, 25, 20]

Я знаю, что лучший способ удаления дубликатов - set(mylist), но можно ли узнать, какие значения дублируются? Как вы можете видеть, в этом списке дубликаты - это первое и последнее значения. [0, 3].

Можно ли получить этот результат или что-то подобное в python? Я стараюсь избегать делать смехотворно большой условный оператор if elif.

4b9b3361

Ответ 1

Эти ответы - O (n), поэтому немного больше кода, чем использование mylist.count(), но гораздо более эффективное, поскольку mylist увеличивается дольше

Если вы просто хотите знать дубликаты, используйте collections.Counter

from collections import Counter
mylist = [20, 30, 25, 20]
[k for k,v in Counter(mylist).items() if v>1]

Если вам нужно знать индексы,

from collections import defaultdict
D = defaultdict(list)
for i,item in enumerate(mylist):
    D[item].append(i)
D = {k:v for k,v in D.items() if len(v)>1}

Ответ 2

Вот список, который делает то, что вы хотите. Как сообщает @Codemonkey, список начинается с индекса 0, поэтому индексы дубликатов равны 0 и 3.

>>> [i for i, x in enumerate(mylist) if mylist.count(x) > 1]
[0, 3]

Ответ 3

простейший путь без какого-либо промежуточного списка с помощью list.index():

z = ['a', 'b', 'a', 'c', 'b', 'a', ]
[z[i] for i in range(len(z)) if i == z.index(z[i])]
>>>['a', 'b', 'c']

и вы также можете перечислить дубликаты (может содержать дубликаты снова, как в примере):

[z[i] for i in range(len(z)) if not i == z.index(z[i])]
>>>['a', 'b', 'a']

или их индекс:

[i for i in range(len(z)) if not i == z.index(z[i])]
>>>[2, 4, 5]

или дубликаты в виде списка из 2-х наборов их индекса (только для их первого вхождения), , что является ответом на исходный вопрос!!!:

[(i,z.index(z[i])) for i in range(len(z)) if not i == z.index(z[i])]
>>>[(2, 0), (4, 1), (5, 0)]

или это вместе с самим предметом:

[(i,z.index(z[i]),z[i]) for i in range(len(z)) if not i == z.index(z[i])]
>>>[(2, 0, 'a'), (4, 1, 'b'), (5, 0, 'a')]

или любая другая комбинация элементов и индексов....

Ответ 4

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

my_list = [3, 5, 2, 1, 4, 4, 1]
opt = [item for item in set(my_list) if my_list.count(item) > 1]

Ответ 5

Это самый простой способ найти дубликаты в списке:

my_list = [3, 5, 2, 1, 4, 4, 1]

my_list.sort()
for i in range(0,len(my_list)-1):
               if my_list[i] == my_list[i+1]:
                   print str(my_list[i]) + ' is a duplicate'

Ответ 6

Я попытался под кодом найти дубликаты значений из списка

1) создать набор дублированных списков

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

glist=[1, 2, 3, "one", 5, 6, 1, "one"]
x=set(glist)
dup=[]
for c in x:
    if(glist.count(c)>1):
        dup.append(c)
print(dup)

OUTPUT

[1, 'one']

Теперь получите весь индекс для повторяющегося элемента

glist=[1, 2, 3, "one", 5, 6, 1, "one"]
x=set(glist)
dup=[]
for c in x:
    if(glist.count(c)>1):
        indices = [i for i, x in enumerate(glist) if x == c]
        dup.append((c,indices))
print(dup)

OUTPUT

[(1, [0, 6]), ('one', [3, 7])]

Надеюсь, это поможет кому-то

Ответ 7

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

  for i in set(mylist):
    if mylist.count(i) > 1:
         print(i, mylist.index(i))

Ответ 8

Следующее понимание списка даст повторяющиеся значения:

[x for x in mylist if mylist.count(x) >= 2]

Ответ 9

Вы должны отсортировать список:

mylist.sort()

После этого проведите по нему так:

doubles = []
for i, elem in enumerate(mylist):
    if i != 0:
        if elem == old:
            doubles.append(elem)
            old = None
            continue
    old = elem

Ответ 10

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

def dup(x):
    duplicate = []
    unique = []
    for i in x:
        if i in unique:
            duplicate.append(i)
        else:
            unique.append(i)
    print("Duplicate values: ",duplicate)
    print("Unique Values: ",unique)

list1 = [1, 2, 1, 3, 2, 5]
dup(list1)

Ответ 11

m = len(mylist)
for index,value in enumerate(mylist):
        for i in xrange(1,m):
                if(index != i):
                    if (L[i] == L[index]):
                        print "Location %d and location %d has same list-entry:  %r" % (index,i,value)

У этого есть некоторая избыточность, которая может быть улучшена, однако.