Intentando agregar valores de diccionario contando las ocurrencias en una lista de listas (Python)

Estoy intentando obtener un recuento de elementos en una lista de listas y agregar esos recuentos a un diccionario en Python. He hecho con éxito la lista (es una lista de todas las combinaciones posibles de sucesos para los registros de visualización de anuncios individuales) y un diccionario con claves iguales a todos los valores que posiblemente puedan aparecer, y ahora necesito contar cuántas veces ocurre y cambia cada una. Los valores en el diccionario a la cuenta de sus claves correspondientes en la lista de listas. Esto es lo que tengo:

import itertools stuff=(1,2,3,4) n=1 combs=list() while n<=len(stuff): combs.append(list(itertools.combinations(stuff,n))) n = n+1 viewers=((1,3,4),(1,2,4),(1,4),(1,2),(1,4)) recs=list() h=1 while h<=len(viewers): j=1 while j<=len(viewers[h-1]): recs.append(list(itertools.combinations(viewers[h-1],j))) j=j+1 h=h+1 showcount={} for list in combs: for item in list: showcount[item]=0 for k, v in showcount: for item in recs: for item in item: if item == k: v = v+1 

He intentado un montón de maneras diferentes de hacer esto, y generalmente obtengo ‘demasiados valores para descomprimir’ errores o simplemente no se llena. Se publicaron varias preguntas similares, pero soy bastante nuevo en Python y ninguna de ellas abordó lo que necesitaba lo suficientemente cerca como para que yo lo resolviera. Muchas gracias.

Utilice un Counter lugar de un dict ordinario para contar las cosas:

 from collections import Counter showcount = Counter() for item in recs: showcount.update(item) 

o incluso:

 from collections import Counter from itertools import chain showcount = Counter(chain.from_iterable(recs)) 

Como puede ver, eso hace que su código sea mucho más simple.

Si todo lo que desea hacer es aplanar su lista de listas, puede usar itertools.chain ()

 >>> import itertools >>> listOfLists = ((1,3,4),(1,2,4),(1,4),(1,2),(1,4)) >>> flatList = itertools.chain.from_iterable(listOfLists) 

El objeto Counter del módulo de colecciones probablemente hará el rest de lo que desea.

 >>> from collections import Counter >>> Counter(flatList) Counter({1: 5, 4: 4, 2: 2, 3: 1}) 

Tengo un código antiguo que se parece al problema, podría ser útil para las personas que enfrentan un problema similar.

 import sys file = open(sys.argv[-1], "r").read() wordictionary={} for word in file.split(): if word not in wordictionary: wordictionary[word] = 1 else: wordictionary[word] += 1 sortable = [(wordictionary[key], key) for key in wordictionary] sortable.sort() sortable.reverse() for member in sortable: print (member) 

Primero, “aplanar” la lista usando una expresión generadora: (item for sublist in combs for item in sublist) .

Luego, iterar sobre la lista aplanada. Para cada elemento, puede agregar una entrada al dict (si aún no existe) o agregar una al valor.

 d = {} for key in (item for sublist in combs for item in sublist): try: d[key] += 1 except KeyError: # I'm not certain that KeyError is the right one, you might get TypeError. You should check this d[key] = 1 

Esta técnica supone que todos los elementos de las listas secundarias son hashable y se pueden utilizar como claves.