¿Cuál es la mejor forma (mejor que en la forma convencional) de comprobar si todos los elementos de una lista son únicos?
Mi enfoque actual usando a Counter
es:
>>> x = [1, 1, 1, 2, 3, 4, 5, 6, 2]
>>> counter = Counter(x)
>>> for values in counter.itervalues():
if values > 1:
# do something
¿Puedo hacerlo mejor?
len(x) > len(set(x))
es Verdadero cuando los elementosx
NO son únicos. El título de esta pregunta pregunta exactamente lo contrario: "Comprobar si todos los elementos de una lista son únicos"Aquí hay una línea de dos líneas que también hará una salida anticipada:
Si los elementos de x no se pueden cifrar, tendrá que recurrir al uso de una lista para
seen
:fuente
Una solución de salida temprana podría ser
sin embargo, para casos pequeños o si la salida anticipada no es el caso común, esperaría que
len(x) != len(set(x))
sea el método más rápido.fuente
s = set()
...return not any(s.add(x) if x not in s else True for x in g)
len(x) != len(set(x))
ser más rápido que esto si la salida anticipada no es común? ¿No son ambas operaciones O (len (x)) ? (dondex
está la lista original)if x in s
dentro del ciclo O (len (x)) .por velocidad:
fuente
¿Qué tal agregar todas las entradas a un conjunto y verificar su longitud?
fuente
len()
.Alternativa a a
set
, puede utilizar adict
.fuente
Otro enfoque completamente, usando sorted y groupby:
Requiere una ordenación, pero sale en el primer valor repetido.
fuente
groupby
y encontré esta respuesta. Encuentro esto de lo más elegante, ya que es una expresión única y funciona con las herramientas integradas sin requerir ninguna variable adicional o declaración de bucle.id()
ordenar , puede usar la función para ordenarlos, ya que este es un requisito previo paragroupby()
que funcione:groupby(sorted(seq), key=id)
Aquí hay una versión recursiva O (N 2 ) por diversión:
fuente
Aquí hay una función de salida temprana recursiva:
Es lo suficientemente rápido para mí sin usar conversiones extrañas (lentas) mientras tengo un enfoque de estilo funcional.
fuente
H in T
realiza una búsqueda lineal yT = L[1:]
copia la parte cortada de la lista, por lo que esto será mucho más lento que las otras soluciones que se han sugerido en listas grandes. Creo que es O (N ^ 2), mientras que la mayoría de los demás son O (N) (conjuntos) u O (N log N) (soluciones basadas en clasificación).Qué tal esto
fuente
Puede usar la sintaxis de Yan (len (x)> len (set (x))), pero en lugar de set (x), defina una función:
y haz len (x)> len (f5 (x)). Esto será rápido y también preservará el orden.
El código se toma de: http://www.peterbe.com/plog/uniqifiers-benchmark
fuente
x = range(1000000) + range(1000000)
, ejecutar set (x) es más rápido que f5 (x). El orden no es un requisito en la pregunta, pero incluso ejecutar ordenado (conjunto (x)) es aún más rápido que f5 (x)Usando un enfoque similar en un marco de datos de Pandas para probar si el contenido de una columna contiene valores únicos:
Para mí, esto es instantáneo en una variable int en un marco de fecha que contiene más de un millón de filas.
fuente
todas las respuestas anteriores son buenas pero prefiero usar
all_unique
ejemplo de 30 segundos de Pythonnecesitas usar
set()
en la lista dada para eliminar duplicados, compare su longitud con la longitud de la lista.devuelve
True
si todos los valores en una lista plana sonunique
, de loFalse
contrariofuente
Para principiantes:
fuente