如何从哈希值中获取所有可能的组合

普米希纳

我有一个像这样的数组散列:

{a: [1, 2], b: [3, 4]}

我正在尝试构建一个数组,其中包含所有可能的值组合,每个组合来自不同的键值对,格式如下:

[{a: 1, b: 3}, {a: 1, b: 4}, {a: 2, b: 3}, {a: 2, b: 4}]

散列可以有n键,每个都可以有m值——我不能假设任何数字。每个值(数组)可以有不同的大小。以下也是有效的输入:

{a: [1, 2, 3], b: [4, 5, 6, 7], c: [8, 9, 10, 11, 12]}

我得到的最好的是一个包含所有值排列但没有键的数组:

a = {a:[1, 2, 3], b: [4, 5, 6], c: [7, 8, 9]}
a.reduce([]) { |acc, (k, v)| acc.empty? ? v : acc.product(v)  }.map(&:flatten)
=> [[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]]

我应该如何在 Ruby 中做到这一点?

米奇·舒

基本计划:

从一个包含空散列的数组开始。

每个键值对:将数组中的每个哈希映射到hash.merge({key=> value})每个值的数组压平

对每个键重复

hash = {a: [1, 2], b: [3, 4]}
array = [{}]
hash.each_pair do |key, values|
  array.map! do |hash| 
    values.map do |value|
      hash.merge({key=> value})
    end
  end.flatten!
end

array
=> [{:a=>1, :b=>3}, {:a=>1, :b=>4}, {:a=>2, :b=>3}, {:a=>2, :b=>4}] 

可以用更好的代码和可枚举方法的使用来清理,但这应该是你的一般想法。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章