[英]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"]}
另一種方法: 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.