2010-03-05 40 views
6

¿Cómo puedo encontrar el número total de duplicados en una cadena? es decir, si fuera j= [1,1,1,2,2,2], ¿encontraría 4 duplicados? Solo he podido encontrar el recuento que muestra cuántas veces ha ocurrido cada número individual.Contando duplicados enteros en Python

Respuesta

17
>>> j= [1,1,1,2,2,2] 
>>> len(j) - len(set(j)) 
4 

y por cierto, j es una lista y no una cadena, aunque para el propósito de este ejercicio que en realidad no importa.

7

Parece que ya hay una respuesta popular, pero si también desea mantener los recuentos duplicados individuales, el nuevo objeto de colección Counter() en Python 2.7 es perfecto para esto.

>>> from collections import Counter 

>>> j = [1,1,1,2,2,2] 

>>> Counter(j) 
Counter({1: 3, 2: 3}) 

>>> sum([i - 1 for i in c.values() if i > 1]) 
4 

>>> {k: v - 1 for k, v in c.items()} # individual dupes 
{1: 2, 2: 2} 

hay un backport for Counter at ActiveState

+1

Algunas sugerencias/observaciones: Uno tiene que asumir que 'c = Contador (j)' es ejecutado en alguna parte. Con tu suma de cosas, necesitas Python 2.7 para poder perder el '[]'. En segundo lugar, la cláusula 'si' es redundante. En tercer lugar, no tiene sentido crear la lista 'c.values ​​()'. Resultado: 'suma (i - 1 para i en c.itervalues ​​())' o después de algo de álgebra, pruebe 'sum (c.itervalues ​​()) - len (c)'. Intenta agregar un no dupe, p. 3 a la entrada. Comprueba si tu diccionario de engaños individuales es realmente lo que pretendías. HTH. –

+0

OK ... En primer lugar, dime cómo 'i> 1' es" redundante "? Necesito ** para evitar 'i <0' en caso de que los enteros negativos alguna vez lleguen al dict. Entonces la comparación ocurre independientemente. Ahora considere una lista de elementos de 1M, donde 999,000 son '0' y luego dígame que no debo seguir adelante y evitar que' 0' también se agregue a la lista. "Después de un poco de álgebra" suena como si me estuvieras diciendo que tengo que aprenderlo, pero como acabo de decir, me gustaría asegurarme de que '-1000000' no pertenezca al dict, en caso de que sea distinto de' Counter () 'lo modifica. – jonwd7

+0

En segundo lugar, mi uso de 'Counter()' no requiere 2.7 en absoluto ya que he incluido un enlace al backport. (Utilizo una comprensión dict pero eso puede cambiarse muy rápidamente). Por lo tanto, puedo o no ser capaz de "perder el' [] '" ... ¿Pero qué importa eso? En tercer lugar, 'itervalues' /' iteritems' era inútil para este simple ejemplo y más difícil de escribir, así que discúlpeme. Y, por último, realmente no tengo idea de lo que quieres decir con un 3 sin errores ... Imprimirá '..., 3: 0}' y eso puede ser o no exactamente lo que OP * et todos * quieren pasar en esa situación. 'i> 0' entonces? – jonwd7