Print out all combinations of elements in an array of arrays
Question:
Say you had the following
x = [[1,2,3], [4,5,6], [7,8,9]]
What’s the best way, say in python or ruby, to print out all combinations of the inner elements?
So the result would look like:
147,
148,
149,
157,
158,
159,
167,
...
This would lead to a more universal way of solving typical interview type questions like ‘print all letter combinations of a phone number’ or ‘print the bit chart of number x.’
Anyway, thoughts?
Answers:
I’d do in Ruby :
x = [[1,2,3], [4,5,6], [7,8,9]]
x.first.product(*x[1..-1]).map{ |ary| ary.join.to_i }
# => [147,
# 148,
# 149,
# 157,
# 158,
# 159,
# 167,
# 168,
# 169,
# 247,
# 248,
# 249,
# 257,
# 258,
# 259,
# 267,
# 268,
# 269,
# 347,
# 348,
# 349,
# 357,
# 358,
# 359,
# 367,
# 368,
# 369]
In python:
>>> x = [[1,2,3], [4,5,6], [7,8,9]]
>>> import itertools as it
>>> [x for x in it.product (*x) ]
[(1, 4, 7), (1, 4, 8), (1, 4, 9), (1, 5, 7), (1, 5, 8), (1, 5, 9), (1, 6, 7), (1, 6, 8), (1, 6, 9), (2, 4, 7), (2, 4, 8), (2, 4, 9), (2, 5, 7), (2, 5, 8), (2, 5, 9), (2, 6, 7), (2, 6, 8), (2, 6, 9), (3, 4, 7), (3, 4, 8), (3, 4, 9), (3, 5, 7), (3, 5, 8), (3, 5, 9), (3, 6, 7), (3, 6, 8), (3, 6, 9)]
Or if you want ints:
>>> [int(''.join(str(x) for x in x)) for x in it.product(*x)]
[147, 148, 149, 157, 158, 159, 167, 168, 169, 247, 248, 249, 257, 258, 259, 267, 268, 269, 347, 348, 349, 357, 358, 359, 367, 368, 369]
Or without string manipulation:
def makeNumber(t):
sum (10 ** i * e for i, e in enumerate(t[::-1]))
x = [[1,2,3], [4,5,6], [7,8,9]]
print([makeNumber(x) for x in it.product(*x)])
x = [[1,2,3], [4,5,6], [7,8,9]]
x.shift.product(*x).map(&:join)
Say you had the following
x = [[1,2,3], [4,5,6], [7,8,9]]
What’s the best way, say in python or ruby, to print out all combinations of the inner elements?
So the result would look like:
147,
148,
149,
157,
158,
159,
167,
...
This would lead to a more universal way of solving typical interview type questions like ‘print all letter combinations of a phone number’ or ‘print the bit chart of number x.’
Anyway, thoughts?
I’d do in Ruby :
x = [[1,2,3], [4,5,6], [7,8,9]]
x.first.product(*x[1..-1]).map{ |ary| ary.join.to_i }
# => [147,
# 148,
# 149,
# 157,
# 158,
# 159,
# 167,
# 168,
# 169,
# 247,
# 248,
# 249,
# 257,
# 258,
# 259,
# 267,
# 268,
# 269,
# 347,
# 348,
# 349,
# 357,
# 358,
# 359,
# 367,
# 368,
# 369]
In python:
>>> x = [[1,2,3], [4,5,6], [7,8,9]]
>>> import itertools as it
>>> [x for x in it.product (*x) ]
[(1, 4, 7), (1, 4, 8), (1, 4, 9), (1, 5, 7), (1, 5, 8), (1, 5, 9), (1, 6, 7), (1, 6, 8), (1, 6, 9), (2, 4, 7), (2, 4, 8), (2, 4, 9), (2, 5, 7), (2, 5, 8), (2, 5, 9), (2, 6, 7), (2, 6, 8), (2, 6, 9), (3, 4, 7), (3, 4, 8), (3, 4, 9), (3, 5, 7), (3, 5, 8), (3, 5, 9), (3, 6, 7), (3, 6, 8), (3, 6, 9)]
Or if you want ints:
>>> [int(''.join(str(x) for x in x)) for x in it.product(*x)]
[147, 148, 149, 157, 158, 159, 167, 168, 169, 247, 248, 249, 257, 258, 259, 267, 268, 269, 347, 348, 349, 357, 358, 359, 367, 368, 369]
Or without string manipulation:
def makeNumber(t):
sum (10 ** i * e for i, e in enumerate(t[::-1]))
x = [[1,2,3], [4,5,6], [7,8,9]]
print([makeNumber(x) for x in it.product(*x)])
x = [[1,2,3], [4,5,6], [7,8,9]]
x.shift.product(*x).map(&:join)