Cómo aplanar una lista de listas un paso

Tengo una lista de listas de tuplas

A= [ [(1,2,3),(4,5,6)], [(7,8,9),(8,7,6),(5,4,3)],[(2,1,0),(1,3,5)] ] 

La lista externa puede tener cualquier número de listas internas, las listas internas pueden tener cualquier número de tuplas, una tupla siempre tiene 3 enteros.

Quiero generar todas las combinaciones de tuplas, una de cada lista:

 [(1,2,3),(7,8,9),(2,1,0)] [(1,2,3),(7,8,9),(1,3,5)] [(1,2,3),(8,7,6),(2,1,0)] ... [(4,5,6),(5,4,3),(1,3,5)] 

Una forma simple de hacerlo es usar una función similar a itertools.poduct() pero debe llamarse así.

 itertools.product([(1,2,3),(4,5,6)], [(7,8,9),(8,7,6),(5,4,3)],[(2,1,0),(1,3,5)]) 

Es decir, la lista externa se elimina. Y no sé cómo hacer eso. ¿Hay una mejor manera de generar todas las combinaciones de tuplas?

 itertools.product(*A) 

Para más detalles revisa el tutorial de python

Esto funciona para su ejemplo, si solo hay un nivel de listas anidadas (no hay listas de listas de listas):

 itertools.product(*A) 

Probablemente puedas llamarlo itertools.product like as:

 itertools.product(*A) # where A is your list of lists of tuples 

De esta manera, expande los elementos de su lista en argumentos para la función que está llamando.

Tarde a la fiesta pero …

Soy nuevo en Python y vengo de un fondo claro. Esto es lo que se me ocurrió (verifique los nombres de var para lulz):

 def flatten(lst): if lst: car,*cdr=lst if isinstance(car,(list)): if cdr: return flatten(car) + flatten(cdr) return flatten(car) if cdr: return [car] + flatten(cdr) return [car] 

Parece funcionar. Prueba:

 A = [ [(1,2,3),(4,5,6)], [(7,8,9),(8,7,6),(5,4,3)],[(2,1,0),(1,3,5)] ] flatten(A) 

Resultado:

 [(1, 2, 3), (4, 5, 6), (7, 8, 9), (8, 7, 6), (5, 4, 3), (2, 1, 0), (1, 3, 5)] 

Nota: el car,*cdr=lst línea car,*cdr=lst solo funciona en Python 3.0

Este no es exactamente un paso, pero haría lo que quisiera si por alguna razón no quisiera usar la solución de itertools:

 def crossprod(listoflists): if len(listoflists) == 1: return listoflists else: result = [] remaining_product = prod(listoflists[1:]) for outertupe in listoflists[0]: for innercombo in remaining_product[0]: newcombo = [outertupe] newcombo.append(innercombo) result.append(newcombo) return result 
 def flatten(A) answer = [] for i in A: if type(i) == list: ans.extend(i) else: ans.append(i) return ans 

Esto también se puede lograr utilizando la comprensión de la lista.

 In [62]: A = [ [(1,2,3),(4,5,6)], [(7,8,9),(8,7,6),(5,4,3)],[(2,1,0),(1,3,5)] ] In [63]: improved_list = [num for elem in A for num in elem] In [64]: improved_list Out[64]: [(1, 2, 3), (4, 5, 6), (7, 8, 9), (8, 7, 6), (5, 4, 3), (2, 1, 0), (1, 3, 5)]