Saltar al contenido

Cómo crear una lista de diccionarios a partir de un diccionario con listas de diferentes longitudes

Mantén la atención porque en esta división hallarás el arreglo que buscas.

Solución:

Puedes usar itertools.zip_longest y filtrar None valores:

from itertools import zip_longest

[x: y for x, y in zip(d, t) if y is not None for t in zip_longest(*d.values())]
# ['name': 'bob', 'age': 13, 'height': 164, 'job': 'programmer', 
#  'name': 'john', 'age': 19, 'height': 188, 
#  'name': 'harry', 'age': 23, 
#  'name': 'mary']

Puedes usar zip_longest aquí:

from itertools import zip_longest

keys = d.keys()

d2 = [
    k: v for k, v in zip(keys, vs) if v is not None
    for vs in zip_longest(*d.values())
]

Si los valores pueden ser None también, podemos eludir eso usando un valor ficticio:

from itertools import zip_longest

keys = d.keys()
dummy = object()

d2 = [
    k: v for k, v in zip(keys, vs) if v is not dummy
    for vs in zip_longest(*d.values(), fillvalue=dummy)
]

Aquí el muñeco es un objeto del cual estamos seguros que no es parte de los ítems en d (ya que lo construimos después de que construimos d). usando un is comparación, así podemos saber si ese valor era el “fillvalue”.

Esto nos dará:

>>> d2
['name': 'bob', 'age': 13, 'height': 164, 'job': 'programmer', 'name': 'john', 'age': 19, 'height': 188, 'name': 'harry', 'age': 23, 'name': 'mary']

Aquí hay otro enfoque:

d = 'name': ['bob', 'john', 'harry', 'mary'], 'age': [13, 19, 23], 'height': [164, 188], 'job': ['programmer']
m = max(map(len, d.values()))
d1 = k : (v if len(v)==m else v+['']*(m-len(v))) for k,v in d.items()
d2 = [k:v for k,v in zip(d, t) if v for t in zip(*d1.values())]
print(d2)

Producción :

['height': 164, 'age': 13, 'job': 'programmer', 'name': 'bob', 'height': 188, 'age': 19, 'name': 'john', 'age': 23, 'name': 'harry', 'name': 'mary']

Aquí puedes ver las comentarios y valoraciones de los lectores

Si haces scroll puedes encontrar las ilustraciones de otros desarrolladores, tú aún tienes la habilidad mostrar el tuyo si lo crees conveniente.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *