从多个数组生成值的组合
Generate combinations of values from multiple arrays
我有四个等长的数组:
a = [1, 2, 3, 4, 5]
b = ['A', 'B', 'C', 'D', 'E']
c = ['J', 'K', 'L', 'M', 'N']
d = ['v', 'w', 'x', 'y', 'z']
我想通过从每个数组中取出一个元素来获得所有可能组合的数组:
[
[1, 'A', 'J', 'v'],
[2, 'A', 'J', 'v'],
[3, 'A', 'J', 'v'],
...
]
我正在这样做:
master_array = []
for i in first_names do
sub_array = []
for j in last_names do
for k in city do
for l in state do
sub_array.push(i, j, k, l)
end
end
end
master_array.push(sub_array)
end
master_array
理想情况下,我想要 return 一个散列数组,其键是数组的名称,如下所示:
[
{a: 1, b: 'A', c: 'J', d: 'v'},
{a: 2, b: 'A', c: 'J', d: 'v'},
{a: 3, b: 'A', c: 'J', d: 'v'},
...
]
如果您想要所有可能的组合,除了遍历所有数组的每个元素之外别无选择。
创建哈希也不难。
试试这个。
a = [1, 2, 3, 4, 5]
b = ['A', 'B', 'C', 'D', 'E']
c = ['J', 'K', 'L', 'M', 'N']
d = ['v', 'w', 'x', 'y', 'z']
result = []
a.each do |a_elem|
b.each do |b_elem|
c.each do |c_elem|
d.each do |d_elem|
result << {a: a_elem, b: b_elem, c: c_elem, d: d_elem}
end
end
end
end
puts "#{result}"
我相信这就是您要找的。
按照@sagarpandya 的建议使用Array#product。
def get_em_all(*arr)
arr.shift.product(*arr)
end
get_em_all(a, b, c, d)
# => [[1, "A", "J", "v"], [1, "A", "J", "w"], [1, "A", "J", "x"], [1, "A", "J", "y"],
# [1, "A", "J", "z"], [1, "A", "K", "v"], [1, "A", "K", "w"], [1, "A", "K", "x"],
# ...
# [5, "E", "N", "w"], [5, "E", "N", "x"], [5, "E", "N", "y"], [5, "E", "N", "z"]]
get_em_all(a, b, c, d).size
#=> 625 (= 5**4)
请注意,如果 get_em_all
的参数更改为其他内容——例如 8 个 3 元素数组——不需要对方法进行任何更改。
对象(例如数组)不知道保存它们的一个或多个变量。例如,考虑
a = [1,2,3]
b = a
#=> [1, 2, 3]
a.object_id
#=> 4303360
b.object_id
#=> 4303360
变量a
和变量b
都是同一个对象,数组[1,2,3]
。
因此,要获得所需的哈希数组,您必须在编译时使用文字键构造它,硬连接到四个数组 a
、b
、c
,以及 k
。此外,没有理由使用变量名作为散列的键。这在多个层面上都是糟糕的编程实践。
我有四个等长的数组:
a = [1, 2, 3, 4, 5]
b = ['A', 'B', 'C', 'D', 'E']
c = ['J', 'K', 'L', 'M', 'N']
d = ['v', 'w', 'x', 'y', 'z']
我想通过从每个数组中取出一个元素来获得所有可能组合的数组:
[
[1, 'A', 'J', 'v'],
[2, 'A', 'J', 'v'],
[3, 'A', 'J', 'v'],
...
]
我正在这样做:
master_array = []
for i in first_names do
sub_array = []
for j in last_names do
for k in city do
for l in state do
sub_array.push(i, j, k, l)
end
end
end
master_array.push(sub_array)
end
master_array
理想情况下,我想要 return 一个散列数组,其键是数组的名称,如下所示:
[
{a: 1, b: 'A', c: 'J', d: 'v'},
{a: 2, b: 'A', c: 'J', d: 'v'},
{a: 3, b: 'A', c: 'J', d: 'v'},
...
]
如果您想要所有可能的组合,除了遍历所有数组的每个元素之外别无选择。
创建哈希也不难。
试试这个。
a = [1, 2, 3, 4, 5]
b = ['A', 'B', 'C', 'D', 'E']
c = ['J', 'K', 'L', 'M', 'N']
d = ['v', 'w', 'x', 'y', 'z']
result = []
a.each do |a_elem|
b.each do |b_elem|
c.each do |c_elem|
d.each do |d_elem|
result << {a: a_elem, b: b_elem, c: c_elem, d: d_elem}
end
end
end
end
puts "#{result}"
我相信这就是您要找的。
按照@sagarpandya 的建议使用Array#product。
def get_em_all(*arr)
arr.shift.product(*arr)
end
get_em_all(a, b, c, d)
# => [[1, "A", "J", "v"], [1, "A", "J", "w"], [1, "A", "J", "x"], [1, "A", "J", "y"],
# [1, "A", "J", "z"], [1, "A", "K", "v"], [1, "A", "K", "w"], [1, "A", "K", "x"],
# ...
# [5, "E", "N", "w"], [5, "E", "N", "x"], [5, "E", "N", "y"], [5, "E", "N", "z"]]
get_em_all(a, b, c, d).size
#=> 625 (= 5**4)
请注意,如果 get_em_all
的参数更改为其他内容——例如 8 个 3 元素数组——不需要对方法进行任何更改。
对象(例如数组)不知道保存它们的一个或多个变量。例如,考虑
a = [1,2,3]
b = a
#=> [1, 2, 3]
a.object_id
#=> 4303360
b.object_id
#=> 4303360
变量a
和变量b
都是同一个对象,数组[1,2,3]
。
因此,要获得所需的哈希数组,您必须在编译时使用文字键构造它,硬连接到四个数组 a
、b
、c
,以及 k
。此外,没有理由使用变量名作为散列的键。这在多个层面上都是糟糕的编程实践。