Eliminar elementos únicos de una lista

Me enfrenté a algún problema para resolver el siguiente problema:

Tenemos una lista de elementos (enteros), y deberíamos devolver una lista que conste solo de los elementos no únicos en esta lista. Sin cambiar el orden de la lista, creo que la mejor manera es eliminar o eliminar todos los elementos únicos.

Tenga en cuenta que acabo de empezar a aprender python y me gustaría solo las soluciones más simples.

Aquí está mi código:

def checkio(data): for i in data: if data.count(i) == 1: #if element seen in the list just ones, we delet this el ind = data.index(i) del data[ind] return data 

    Se puede hacer que su función funcione mediante la iteración de la lista a la inversa:

     def checkio(data): for index in range(len(data) - 1, -1, -1): if data.count(data[index]) == 1: del data[index] return data print(checkio([3, 3, 5, 8, 1, 4, 5, 2, 4, 4, 3, 0])) [3, 3, 5, 4, 5, 4, 4, 3] print(checkio([1, 2, 3, 4])) [] 

    Esto funciona, porque solo borra números en la sección de la lista que ya ha sido iterada.

    Puede implementar un OrderedCounter , por ejemplo:

     from collections import OrderedDict, Counter class OrderedCounter(Counter, OrderedDict): pass data = [1, 3, 1, 2, 3, 5, 8, 1, 5, 2] duplicates = [k for k, v in OrderedCounter(data).items() if v > 1] # [1, 3, 2, 5] 

    Entonces cuenta la ocurrencia de cada valor, luego filtra si tiene una frecuencia de más de uno. Heredar de OrderedDict significa que se conserva el orden de los elementos originales.


    A partir de los comentarios, desea que todos los elementos duplicados se reserven, por lo que puede pre-construir un conjunto de las entradas duplicadas, y luego volver a iterar su lista original, por ejemplo:

     from collections import Counter data = [1, 3, 1, 2, 3, 5, 8, 1, 5, 2] duplicates = {k for k, v in Counter(data).items() if v > 1} result = [el for el in data if el in duplicates] # [1, 3, 1, 2, 3, 5, 1, 5, 2] 

    Prueba esto:

     >>> a=[1,2,3,3,4,5,6,6,7,8,9,2,0,0] >>> a=[i for i in a if a.count(i)>1] >>> a [2, 3, 3, 6, 6, 2, 0, 0] >>> a=[1, 2, 3, 1, 3] >>> a=[i for i in a if a.count(i)>1] >>> a [1, 3, 1, 3] >>> a=[1, 2, 3, 4, 5] >>> a=[i for i in a if a.count(i)>1] a [] 

    Sólo he usado lista de comprensión.

     def checkio(data): a=[i for i in data if data.count(i)>1] return a print checkio([1,1,2,2,1,1,1,3,4,5,6,7,8]) 
     def checkio(data): lis = [] for i in data: if data.count(i)>1: lis.append(i) print(lis) checkio([1,2,3,3,2,1]) 

    Sí, es un poco tarde para contribuir a este hilo, pero solo quería ponerlo en la red para que lo usen los demás.

    Siguiendo lo que ha comenzado, iterando en la lista de enteros, pero sin contar o eliminar elementos, intente simplemente probar si el elemento ya se ha visto, adjúntelo a una lista de elementos duplicados:

     def checkio(data): elements = [] duplicates = [] for i in data: if i not in elements: elements.append(i) else: if i not in duplicates: duplicates.append(i) return duplicates d = [1, 3, 1, 2, 3, 5, 8, 1, 5, 2] print (checkio(d)) #[1, 3, 5, 2]