如何转换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. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |