valor recorrer propiedades ejemplo diccionarios diccionario declaracion crear comparar como buscar python python-2.7 dictionary

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}]