python - recorrer - Cómo dividir el diccionario en varios diccionarios rápidamente
propiedades diccionarios python (2)
Encontré una solución, pero es muy lenta:
def chunks(self,data, SIZE=10000):
for i in xrange(0, len(data), SIZE):
yield dict(data.items()[i:i+SIZE])
¿Tiene alguna idea sin usar módulos externos (numpy y etc.)
Dado que el diccionario es tan grande, sería mejor mantener todos los elementos involucrados para ser solo iteradores y generadores, como este
from itertools import islice
def chunks(data, SIZE=10000):
it = iter(data)
for i in xrange(0, len(data), SIZE):
yield {k:data[k] for k in islice(it, SIZE)}
Muestra de ejecución:
for item in chunks({i:i for i in xrange(10)}, 3):
print item
Salida
{0: 0, 1: 1, 2: 2}
{3: 3, 4: 4, 5: 5}
{8: 8, 6: 6, 7: 7}
{9: 9}
Otro método es el de los iteradores comprimidos:
>>> from itertools import izip_longest, ifilter
>>> d = {''a'':1, ''b'':2, ''c'':3, ''d'':4, ''e'':5, ''f'':6, ''g'':7, ''h'':8}
Cree una lista con copias de iteradores dict (el número de copias es el número de elementos en los dictados de resultados). Al pasar cada iterador de la lista de chunks
a izip_longest
, obtendrá el número necesario de elementos del dict fuente ( ifilter
utilizado para eliminar None
de los resultados zip). Con la expresión del generador puede reducir el uso de la memoria:
>>> chunks = [d.iteritems()]*3
>>> g = (dict(ifilter(None, v)) for v in izip_longest(*chunks))
>>> list(g)
[{''a'': 1, ''c'': 3, ''b'': 2},
{''e'': 5, ''d'': 4, ''g'': 7},
{''h'': 8, ''f'': 6}]