libreria example espaƱol python combinations

example - product() python



Todas las combinaciones de una lista de listas (5)

La solución más elegante es usar itertools.product en python 2.6.

Si no está utilizando Python 2.6, los documentos para itertools.product en realidad muestran una función equivalente para hacer el producto de la manera "manual":

def product(*args, **kwds): # product(''ABCD'', ''xy'') --> Ax Ay Bx By Cx Cy Dx Dy # product(range(2), repeat=3) --> 000 001 010 011 100 101 110 111 pools = map(tuple, args) * kwds.get(''repeat'', 1) result = [[]] for pool in pools: result = [x+[y] for x in result for y in pool] for prod in result: yield tuple(prod)

Básicamente, estoy buscando una versión de Python de Combination of List<List<int>>

Dada una lista de listas, necesito una nueva lista que proporcione todas las posibles combinaciones de elementos entre las listas.

[[1,2,3],[4,5,6],[7,8,9,10]] -> [[1,4,7],[1,4,8],...,[3,6,10]]

Se desconoce el número de listas, por lo que necesito algo que funcione para todos los casos. ¡Puntos de bonificación por elegancia!


No hay nada de malo con la recursión directa para esta tarea, y si necesita una versión que funcione con cadenas, esto podría satisfacer sus necesidades:

combinations = [] def combine(terms, accum): last = (len(terms) == 1) n = len(terms[0]) for i in range(n): item = accum + terms[0][i] if last: combinations.append(item) else: combine(terms[1:], item) >>> a = [[''ab'',''cd'',''ef''],[''12'',''34'',''56'']] >>> combine(a, '''') >>> print(combinations) [''ab12'', ''ab34'', ''ab56'', ''cd12'', ''cd34'', ''cd56'', ''ef12'', ''ef34'', ''ef56'']


Numpy puede hacerlo:

>>> import numpy >>> a = [[1,2,3],[4,5,6],[7,8,9,10]] >>> [list(x) for x in numpy.array(numpy.meshgrid(*a)).T.reshape(-1,len(a))] [[ 1, 4, 7], [1, 5, 7], [1, 6, 7], ....]


necesita itertools.product :

>>> import itertools >>> a = [[1,2,3],[4,5,6],[7,8,9,10]] >>> list(itertools.product(*a)) [(1, 4, 7), (1, 4, 8), (1, 4, 9), (1, 4, 10), (1, 5, 7), (1, 5, 8), (1, 5, 9), (1, 5, 10), (1, 6, 7), (1, 6, 8), (1, 6, 9), (1, 6, 10), (2, 4, 7), (2, 4, 8), (2, 4, 9), (2, 4, 10), (2, 5, 7), (2, 5, 8), (2, 5, 9), (2, 5, 10), (2, 6, 7), (2, 6, 8), (2, 6, 9), (2, 6, 10), (3, 4, 7), (3, 4, 8), (3, 4, 9), (3, 4, 10), (3, 5, 7), (3, 5, 8), (3, 5, 9), (3, 5, 10), (3, 6, 7), (3, 6, 8), (3, 6, 9), (3, 6, 10)]


listOLists = [[1,2,3],[4,5,6],[7,8,9,10]] for list in itertools.product(*listOLists): print list;

Espero que encuentres eso tan elegante como lo hice cuando lo encontré por primera vez.