Iteración pythonica sobre múltiples listas en paralelo

Me gustaría conocer una forma elegante y pythonica de iterar sobre una lista de listas (o dictado de listas) en paralelo en Python 3. El número de listas no se conoce hasta el tiempo de ejecución, por lo que creo que no puedo simplemente proporcionarlas como argumentos. a la función zip() .

Por ejemplo, dada la siguiente estructura de datos:

var = [['x1' ,'x2' ,'x3'], ['y1', 'y2', 'y3'], ['z1', 'z2', 'z3'], …]

Me gustaría poder acceder a los siguientes valores en cada iteración:

x1,y1,z1 seguido de x2,y2,z2 seguido de x3,y3,z3 y así sucesivamente.

Presumiblemente, podría lograrlo usando los índices de la lista directamente, o usando itertools.chain, pero estoy buscando un enfoque más elegante usando generadores o de otra manera.

zip(*var) desempaquetará automáticamente su lista de listas.

Así por ejemplo:

 var = [['x1' ,'x2' ,'x3'], ['y1', 'y2', 'y3'], ['z1', 'z2', 'z3'], ['w1', 'w2', 'w3']] for ltrs in zip(*var): print(", ".join(ltrs)) 

resultados en

 x1, y1, z1, w1 x2, y2, z2, w2 x3, y3, z3, w3 

Edición: según los comentarios a continuación, quiere usar los elementos de un diccionario,

 var = { 'id_172': ['x1', 'x2', 'x3'], 'id_182': ['y1', 'y2', 'y3'], 'id_197': ['z1', 'z2', 'z3'] } 

Supongo que estamos usando los valores con las claves en orden ordenado:

 keys = sorted(var.keys()) for ltrs in zip(*(var[k] for k in keys)): print(", ".join(ltrs)) 

lo que da

 x1, y1, z1 x2, y2, z2 x3, y3, z3 

Advertencia: tenga en cuenta que esto ordena las claves en orden lexocográfico (es decir, orden alfabético de la cadena), por lo que, por ejemplo, “id_93” aparece después de “id_101”. Si sus tags deben ordenarse en orden numérico, deberá usar una función de tecla personalizada, algo como

 keys = sorted(var.keys(), key=lambda k: int(k[3:])) 

Si observa detenidamente los datos de entrada y salida, en realidad está transponiendo una matriz bidimensional. Eso se puede hacer fácilmente con la función zip incorporada de Python, como esto

 var = [['x1' ,'x2' ,'x3'], ['y1', 'y2', 'y3'], ['z1', 'z2', 'z3']] print list(zip(*var)) # [('x1', 'y1', 'z1'), ('x2', 'y2', 'z2'), ('x3', 'y3', 'z3')] 

Puedes iterar sobre esto, así

 for x, y, z in zip(*var): print x, y, z 

Salida

 x1 y1 z1 x2 y2 z2 x3 y3 z3