加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

如何转换ruby哈希以使值成为指向一组旧密钥的键?

发布时间:2020-12-17 04:02:48 所属栏目:百科 来源:网络整理
导读:我有这样的哈希: t={"4nM"="Triangle","I40"="Triangle","123"="Square"} 我想把它变成哈希,如: {"Triangle" = ["4nM","I40"],"Square" = ["123"]} 做这个的最好方式是什么? 我从group_by开始,但随后代码变得有点复杂…. 这就是我做的: t.group_by { |k,
我有这样的哈希:

t={"4nM"=>"Triangle","I40"=>"Triangle","123"=>"Square"}

我想把它变成哈希,如:

{"Triangle" => ["4nM","I40"],"Square" => ["123"]}

做这个的最好方式是什么?

我从group_by开始,但随后代码变得有点复杂….

这就是我做的:

t.group_by { |k,v| v }.map { |type,group| {type => group.flatten.reject { |x| x == type } } }

解决方法

h = { "4nM"=>"Triangle","123"=>"Square" }

h.each_with_object({}) { |(k,v),h| (h[v] ||= []) << k }
  #=> {"Triangle"=>["4nM","Square"=>["123"]}

表达方式

(h[v] ||= []) << k

扩展到

(h[v] = h[v] || []) << k

如果h有一个密钥v,h [k]将是真实的,所以上面的表达式减少到

(h[v] = h[v]) << k

然后

h[v] << k

如果h没有密钥v,则h [k]#=>没有,所以上面的表达式减少到

(h[v] = []) << k

导致

h[v] #=> [k]

或者,我们可以写

h.each_with_object(Hash.new { |h,k| h[k] = [] }) { |(k,h| h[v] << k }
  #=> {"Triangle"=>["4nM","Square"=>["123"]}

有关使用块返回散列中不存在的键的默认值的说明,请参阅Hash::new.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读