代码之家  ›  专栏  ›  技术社区  ›  Cedric H.

Ruby中散列和数组的操作

  •  0
  • Cedric H.  · 技术社区  · 14 年前

    对于我在这里的第一个问题,我想问你如何在Ruby中完成下面的工作。

    我有一个杂凑与以下方面

    variables["foo"] = [1,2,3]
    variables["bar"] = [4,5,6,7]
    variables[...] = ...
    

    更新:此哈希将具有任意数量的键=>值对。

    所以它表示参数和它们可能的值。我现在要“生成”一个数组,其中包含哈希值,其键=>值对表示变量的每个可能组合。在上面的例子中,我会有一个由12(=3x4)个散列组成的数组

    [ hash1, hash2, ..., hash16]
    

    hash在哪里 会是

     hash1["foo"] = 1
     hash1["bar"] = 4
     hash2["foo"] = 1
     hash2["bar"] = 5
     hash3["foo"] = 1
     hash3["bar"] = 6
     hash4["foo"] = 1
     hash4["bar"] = 7
     hash5["foo"] = 2
     hash5["bar"] = 4
     hash6["foo"] = 3
     hash6["bar"] = 4
     ...
     hash16["foo"] = 3
     hash16["bar"] = 7
    

    我有一些想法,但它们都是非常复杂的嵌套循环。。。

    谢谢!

    3 回复  |  直到 14 年前
        1
  •  1
  •   Jörg W Mittag    14 年前
    vars = {foo: [1, 2, 3], bar: [4, 5, 6, 7]}
    
    (v = vars.map {|k, v| ([k] * v.length).zip(v) }).first.product(*v.drop(1)).
    map {|args| args.reduce({}) {|h, (k, v)| h.tap {|h| h[k] = v }}}
    # => [{:foo=>1, :bar=>4},
    # =>  {:foo=>1, :bar=>5},
    # =>  {:foo=>1, :bar=>6},
    # =>  {:foo=>1, :bar=>7},
    # =>  {:foo=>2, :bar=>4},
    # =>  {:foo=>2, :bar=>5},
    # =>  {:foo=>2, :bar=>6},
    # =>  {:foo=>2, :bar=>7},
    # =>  {:foo=>3, :bar=>4},
    # =>  {:foo=>3, :bar=>5},
    # =>  {:foo=>3, :bar=>6},
    # =>  {:foo=>3, :bar=>7}]
    

    这适用于任意多个条目和任意键。

        2
  •  1
  •   Joshua Cheek    14 年前

    数组的Ruby语法是方括号,哈希是带键的大括号,hash rocket=>value。

    variables = { "foo" => [1,2,3] , "bar" => [4,5,6,7] }
    
    results = Array.new
    
    variables["foo"].each do |foo_variable|
      variables["bar"].each do |bar_variable|
        results << { "foo" => foo_variable , "bar" => bar_variable }
      end
    end
    
    require "pp"
    pp results
    
        3
  •  1
  •   Mladen Jablanović    14 年前
    vars.values.inject(&:product).map{|values|
      Hash[vars.keys.zip(values.flatten)]
    }