簡體   English   中英

將數組轉換為哈希 - Ruby

[英]Converting an array to hash - Ruby

我有以下數組,我想將其轉換為哈希,鍵為年齡,值如人名。 此外,我想確保同齡人屬於同一個密鑰。

ages = [ ['alpha', 20], ['beta',21], ['charlie',23], ['delta', 20] , ['gamma', 23]]

如何將上述內容轉換為如下所示的哈希?

例如 - {20 => ['alpha','delta'] }等。

我已經嘗試了以下代碼,但我被卡在了這一點之外:

hash = Hash[ages.collect {|item| [item[1], item[0]]} ]

散列

謝謝你。

一種可能的解決方案是使用:

hash = ages.each_with_object(Hash.new {|h,k| h[k] = [] }) do |obj, res|
  res[obj.last] << obj.first
end

=> {20=>["alpha", "delta"], 21=>["beta"], 23=>["charlie", "gamma"]}
  1. Hash#default_proc
  2. Enumerable#each_with_object

另一種方法: Hash#transform_values with Enumerable#group_by

ages.
  group_by(&:second).
  transform_values { |entries| entries.map(&:first) }
# => {20=>["alpha", "delta"], 21=>["beta"], 23=>["charlie", "gamma"]}

您可以先創建散列,然后遍歷年齡將相似年齡的成員收集到數組中。

hash = Hash.new{|h,k|h[k]=Array.new()}
ages.each do |age|
  hash[age.last]<<age.first
end
p hash #{20=>["alpha", "delta"], 21=>["beta"], 23=>["charlie", "gamma"]}
ages.each_with_object({}) do |(str,x),h|
  (h[x] ||= []) << str
end
  #=> {20=>["alpha", "delta"], 21=>["beta"], 23=>["charlie", "gamma"]}

h[x] ||= []擴展為

h[x] = h[x] || []

如果h沒有鍵x這將變成

h[x] = nil || []

導致h[x]被設置為一個空數組,之后h[x] << str被執行。

將塊變量表示為|(str,x),h| 利用 Ruby 的數組分解

enum = ages.each_with_object({})
  #=> #<Enumerator: [["alpha", 20], ["beta", 21], ["charlie", 23],
  #     ["delta", 20], ["gamma", 23]]:each_with_object({})> 
(str,x),h = enum.next
  #=> [["alpha", 20], {}] 
str
  #=> "alpha" 
x #=> 20 
h #=> {} 
(h[x] ||= []) << str
  #=> ["alpha"] 

(str,x),h = enum.next
  #=> [["beta", 21], {20=>["alpha"]}] 

等等。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM