Python remodela una lista a una lista multidimensional

Tengo una lista que tiene diferentes longitudes en cada dimensión como a continuación:

list1=[[2,3,4],[1],[77,8,27,12],[25,15]] 

y tengo otra lista con el mismo número de elementos como:

 list2=[a,b,c,d,e,f,g,h,i,j] 

Quiero remodelar mi lista2 como lista1 y procesar dos listas juntas en un bucle for.

Aquí hay una especie de manera linda.

 list1 = [[2,3,4],[1],[77,8,27,12],[25,15]] list2 = list("abcdefghij") list2_iterator = iter(list2) list2_reshaped = [[next(list2_iterator) for _ in sublist] for sublist in list1] print(list2_reshaped) Out: [['a', 'b', 'c'], ['d'], ['e', 'f', 'g', 'h'], ['i', 'j']] 

No sé si es posible con las comprensiones puras.

Acoplar la lista1 para que coincida con la lista2 es fácil: simplemente use itertools.chain.from_iterable(list)) , o flat1 = [elem for sublist in list1 for elem in sublist] , o las otras opciones en esta pregunta .

Ir por el otro lado es un poco más complicado. Pero, en lugar de buscar una sola línea, hagámoslo explícitamente: cree un iterador en la list2 y extraiga los elementos según sea necesario:

 def zipstructured(list1, list2): iter2 = iter(list2) for sublist1 in list1: sublist2 = list(itertools.islice(iter2, len(sublist1))) yield sublist1, sublist2 

Ahora puedes hacer esto:

 >>> list1=[[2,3,4],[1],[77,8,27,12],[25,15]] >>> list2=['a','b','c','d','e','f','g','h','i','j'] >>> for sub1, sub2 in zipstructured(list1, list2): ... print(sub1, sub2) [2, 3, 4] ['a', 'b', 'c'] [1] ['d'] [77, 8, 27, 12] ['e', 'f', 'g', 'h'] [25, 15] ['i', 'j'] 

Si desea procesarlos en un bucle, puede hacer esto:

 list1=[[2,3,4],[1],[77,8,27,12],[25,15]] list2=["a", "b", "c", "d", "e", "f", "g", "h", "i", "j"] last = 0 for ele in list1: print(ele, list2[last : last + len(ele)]) last += len(ele) 

Resultado:

 ([2, 3, 4], ['a', 'b', 'c']) ([1], ['d']) ([77, 8, 27, 12], ['e', 'f', 'g', 'h']) ([25, 15], ['i', 'j'])