Identificar valores duplicados en una lista en Python

¿Es posible obtener qué valores están duplicados en una lista usando python?

Tengo una lista de artículos:

mylist = [20, 30, 25, 20] 

Sé que la mejor manera de eliminar los duplicados es set(mylist) , pero ¿es posible saber qué valores se duplican? Como puede ver, en esta lista los duplicados son el primer y último valor. [0, 3] .

¿Es posible obtener este resultado o algo similar en python? Estoy tratando de evitar hacer una statement condicional ridículamente grande if elif .

Estas respuestas son O (n), por lo que es un poco más de código que usar mylist.count() pero mucho más eficiente a medida que mylist se alarga.

Si solo quieres saber los duplicados, usa colecciones.Contador

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

Si necesitas conocer los índices,

 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} 

Aquí hay una lista de comprensión que hace lo que quieres. Como dice @Codemonkey, la lista comienza en el índice 0, por lo que los índices de los duplicados son 0 y 3.

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

La forma más sencilla sin ninguna lista intermedia usando 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'] 

y también puede enumerar los duplicados (puede contener duplicados nuevamente como en el ejemplo):

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

o su índice:

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

o los duplicados como una lista de 2-tuplas de su índice (referidos solo a su primera aparición), ¿cuál es la respuesta a la pregunta original? :

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

o esto junto con el artículo en sí:

 [(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')] 

o cualquier otra combinación de elementos e índices ….

Puede utilizar la compresión de lista y configurar para reducir la complejidad.

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

La siguiente lista de comprensión dará los valores duplicados:

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

Esa es la forma más sencilla en que puedo pensar para encontrar duplicados en una lista:

 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' 

Intenté debajo del código para encontrar valores duplicados de la lista

1) crear un conjunto de listas duplicadas

2) Iterado a través del conjunto buscando en la lista duplicada.

 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) 

SALIDA

[1 uno’]

Ahora obtén el índice de todo para el elemento duplicado

 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) 

SALIDA

[(1, [0, 6]), (‘uno’, [3, 7])]

Espero que esto ayude a alguien

El siguiente código obtendrá los resultados deseados con elementos duplicados y sus valores de índice.

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

Debes ordenar la lista:

 mylist.sort() 

Después de esto, recorre así:

 doubles = [] for i, elem in enumerate(mylist): if i != 0: if elem == old: doubles.append(elem) old = None continue old = elem 
 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) 

Esto tiene alguna redundancia que puede mejorarse sin embargo.