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