2

この2つの配列があるとしましょう:

a = [1, 2, 3, 4, 5]
b = [6, 7, 8, 9, 10]

私が取得したいのは、次のようなハッシュです。

c = { 1 => [1, 6], 2 => [2, 7], 3 => [3, 8], 4 => [4, 9], 5 => [5, 10] }

これまでに遭遇した唯一の方法は次のとおりです。

# Initialize the resulting Hash and fill in the keys.
c = {}
(a.length).times { |i| c[i + 1] = [] }

# Fill values
c.each_with_index do |(key), idx|
  c[key] = [a[idx], b[idx]]
end

Rubyにはこれを行うためのより良い、またはきれいな方法がありますか?

前もって感謝します。

4

4 に答える 4

10

機能的アプローチ:

Hash[a.zip(b).map.with_index(1) { |pair, idx| [idx, pair] }]
#=> {1=>[1, 6], 2=>[2, 7], 3=>[3, 8], 4=>[4, 9], 5=>[5, 10]}

楽しみのために、そして独自の抽象化を構築したい場合:前のスニペットはwith_index、最初に列挙子(列挙可能ではなく)でのみ機能するため、必要以上に冗長です。次に、値を2番目の要素として配置します(最初のものほど便利です。それは他のほとんどの言語が行うことです)。何ができるでしょうか?Enumerable#indexed逆に機能する独自のメソッドを追加します。この時点でEnumerable#to_h.

a.zip(b).indexed(1).to_h
于 2013-06-06T08:30:30.043 に答える
8
c = Hash[(1..a.size).zip(a.zip(b))]

これは、ハッシュのキーと値のペアの初期化子を利用します。

于 2013-06-06T08:38:21.923 に答える
0

Ruby には、これに対するより良い方法やきれいな方法がありますか?

もちろん、そうです!

a = [1, 2, 3, 4, 5]
b = [6, 7, 8, 9, 10]

c = a.zip(b).each.with_index.with_object({}) do |(arr, idx), memo|
  memo[idx + 1] = arr
end

c # => {1=>[1, 6], 2=>[2, 7], 3=>[3, 8], 4=>[4, 9], 5=>[5, 10]}
于 2013-06-06T08:30:08.133 に答える