Манипулирование хешами и массивами в Ruby - PullRequest
0 голосов
/ 16 августа 2010

На мой первый вопрос здесь я хотел бы спросить вас, как бы вы сделали следующее в Ruby.

У меня есть хеш со следующим аспектом

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

Обновление: этот хеш будет иметь произвольное количество пар ключ => значений.

Таким образом, он представляет параметры и их возможные значения. Теперь я хотел бы «сгенерировать» массив, содержащий хэши, чьи пары ключ => значение представляют каждую возможную комбинацию переменных. В приведенном выше примере у меня был бы массив из 12 (= 3x4) хешей, подобный этому

[ hash1, hash2, ..., hash16]

где хэш i будет

 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 ]

1 голос
/ 16 августа 2010
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}]

Это работает с произвольным множеством записей и произвольных ключей.

1 голос
/ 16 августа 2010
vars.values.inject(&:product).map{|values|
  Hash[vars.keys.zip(values.flatten)]
}
1 голос
/ 16 августа 2010

Синтаксис Ruby для массива - это скобки, а для хэша - фигурные скобки с ключом, хэш-ракета => значение.

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...