All Possible Replacements Of Two Lists?
Solution 1:
Creating 3 lists of two elements would not over-complicate the code at all. zip
can "flip the axes" of multiple lists trivially (making X sequences of Y elements into Y sequences of X elements), making it easy to use itertools.product
:
import itertools
a = [1,2,3]
b = [4,5,6]
# Unpacking result of zip(a, b) means you automatically pass# (1, 4), (2, 5), (3, 6)# as the arguments to itertools.product
output = list(itertools.product(*zip(a, b)))
print(*output, sep="\n")
Which outputs:
(1, 2, 3)
(1, 2, 6)
(1, 5, 3)
(1, 5, 6)
(4, 2, 3)
(4, 2, 6)
(4, 5, 3)
(4, 5, 6)
Different ordering than your example output, but it's the same set of possible replacements.
Solution 2:
Each item may independently be replaced or left alone. This can be modeled by a bit being 1 or 0. If you consider each item to be a separate bit, then iterating over all of the possibilities can be mapped to iterating over all of the combinations of n bits.
In other words, iterate from 0 to 2-1 and look at the bit patterns.
n = len(a)
for i inrange(2**n):
yield [a[j] if i & (1 << j) != 0else b[j] for j inrange(n)]
Breaking this down, i & (1 << j) != 0
checks if the jth bit of i is set. If it is, use a[j]
, otherwise b[j]
.
Result:
[1, 2, 3]
[4, 2, 3]
[1, 5, 3]
[4, 5, 3]
[1, 2, 6]
[4, 2, 6]
[1, 5, 6]
[4, 5, 6]
Solution 3:
Okay this is similar to the other answers, but taking a bit from both. You can model your problem as finding all possible bits of a sequence of given length, and replacing only when there is 1, and otherwise not.
from itertools import product
a = [1,2,3]
b = [4,5,6]
## All binary combinations of length of a (or b)
combinations = product([0,1], repeat=len(a))
for combination in combinations:
y = []
for l, i inzip(zip(a,b),combination):
y.append(l[i])
print y
All combinations of bits are:
(0, 0, 0)
(0, 0, 1)
(0, 1, 0)
(0, 1, 1)
(1, 0, 0)
(1, 0, 1)
(1, 1, 0)
(1, 1, 1)
Which results in:
[1, 2, 3]
[1, 2, 6]
[1, 5, 3]
[1, 5, 6]
[4, 2, 3]
[4, 2, 6]
[4, 5, 3]
[4, 5, 6]
Post a Comment for "All Possible Replacements Of Two Lists?"