on generating combinations among a variable list of lists
Peter Otten
__peter__ at web.de
Sun Jun 28 09:07:31 EDT 2020
Boris Dorestand wrote:
> Say we have [1,3,5,7], [2,3], [1,10]. I'd like to generate
>
> [1,2,1]
> [1,2,10]
> [1,3,1]
> [1,3,10]
> [3,2,1]
> [3,2,10]
> [3,3,1]
> [3,3,10]
> [5, ...]
> ...
> [7,3,10]
>
> The number of input lists is variable. The example shows three lists,
> but there could be only one or ten lists or any other number of lists.
>
> I looked at itertools. There doesn't seem to be any procedure ready for
> this. I might have to combine some of them but I'm not yet sure how.
itertools.product() seems to do what you want:
>>> for t in itertools.product([1,3,5,7], [2,3], [1,10]):
... print(t)
...
(1, 2, 1)
(1, 2, 10)
(1, 3, 1)
(1, 3, 10)
(3, 2, 1)
(3, 2, 10)
(3, 3, 1)
(3, 3, 10)
(5, 2, 1)
(5, 2, 10)
(5, 3, 1)
(5, 3, 10)
(7, 2, 1)
(7, 2, 10)
(7, 3, 1)
(7, 3, 10)
If you need lists instead of tuples convert them
>>> list(t)
[7, 3, 10]
To pass a varying number of lists use a list of lists and a star argument:
>>> lists = [[[1, 2], [3, 4]], [[10, 20, 30], [40, 50]]]
>>> for item in lists:
... print(list(itertools.product(*item)))
...
[(1, 3), (1, 4), (2, 3), (2, 4)]
[(10, 40), (10, 50), (20, 40), (20, 50), (30, 40), (30, 50)]
More information about the Python-list
mailing list