Contando el número de entradas de la lista que ocurren 1 vez

Estoy intentando escribir una función de Python que cuenta el número de entradas en una lista que ocurren exactamente una vez.

Por ejemplo, dada la lista [17], esta función devolvería 1. O dado [3,3, -22,1, -22,1,3,0], devolvería 1.

** Restricción: No puedo importar nada en mi progtwig.

El código incorrecto que he escrito hasta ahora: voy por la ruta de doble bucle, pero el índice matemático se está complicando demasiado.

def count_unique(x): if len(x) == 1: return 1 i = 0 j = 1 for i in range(len(x)): for j in range(j,len(x)): if x[i] == x[j]: del x[j] j+1 j = 0 return len(x) 

    Una solución más simple y comprensible:

     l = [3, 3, -22, 1, -22, 1, 3, 0] counter = 0 for el in l: if l.count(el) == 1: counter += 1 

    Es bastante simple Usted itera sobre los elementos de la lista. Luego mira si el elemento está exactamente una vez en la lista y luego agrega +1. Puede mejorar el código (hacer listas de comprensión, usar expresiones lambda, etc.), pero esta es la idea detrás de todo esto y la más comprensible, imo.

    Ya que no puedes usar collections.Counter . itertools.groupby u sorted / itertools.groupby (uno de los cuales suele ser mi solución, dependiendo de si las entradas son hashables o clasificables), simplemente simula aproximadamente el mismo comportamiento que un Counter , contando todos los elementos y luego contando el número de elementos que aparecieron una sola vez al final:

     def count_unique(x): if len(x) <= 1: return len(x) counts = {} for val in x: counts[val] = counts.get(val, 0) + 1 return sum(1 for count in counts.values() if count == 1) 
     lst = [3,3,-22,1,-22,1,3,0] len(filter(lambda z : z[0] == 1, map(lambda x : (len(filter(lambda y : y == x, lst)), x), lst))) 

    lo siento 🙂

    Tu solución no funciona porque estás haciendo algo raro. Eliminar cosas de una lista mientras se recorre iterativamente, j + 1 no tiene sentido, etc. Intente agregar elementos que se consideran únicos a una nueva lista y luego contar la cantidad de cosas que hay en ella. Entonces averigua lo que hace mi solución.

    Aquí está la solución O (n) por cierto:

     lst = [3,3,-22,1,-22,1,3,0,37] cnts = {} for n in lst: if n in cnts: cnts[n] = cnts[n] + 1 else: cnts[n] = 1 count = 0 for k, v in cnts.iteritems(): if v == 1: count += 1 print count 

    Estás haciendo esto demasiado complicado. intente usar un diccionario donde la clave sea el elemento en su lista. De esa forma, si existe, será único.

    para añadir a esto. Probablemente sea el mejor método cuando se mira la complejidad. una búsqueda en un diccionario se considera O(1) , el bucle for es O(n) por lo que su complejidad de tiempo es O(n) que es deseable … usar count () en un elemento de lista hace una búsqueda en el lista completa para cada elemento que es básicamente O(n^2) … eso es malo

     from collections import defaultdict count_hash_table = defaultdict(int) # i am making a regular dictionary but its data type is an integer elements = [3,3,-22,1,-22,1,3,0] for element in elements: count_hash_table[element] += 1 # here i am using that default datatype to count + 1 for each type print sum(c for c in count_hash_table.values() if c == 1): 
     There is method on lists called count.... from this you can go further i guess. for example: for el in l: if l.count(el) > 1: continue else: print("found {0}".format(el))