将哈希值分组为数组

3

我很少接触Ruby,所以我在格式化数据方面遇到了困难。

我有一个哈希表,其中包含一些具有相同值的键,例如:

{"key" => "value1", "key2" => "value2", "key3" => "value3", "key4" => "value1", "key5" => "value2" ..}

我正在尝试将其转换为一个包含按值分组的键的数组。
 [["key","key4"],["key2","key5"],["key3"]]
3个回答

6
new_hash = {}
hash.each do |key, value|
  new_hash[value] ||= []
  new_hash[value] << key
end
array = new_hash.values # => [["key", "key4"], ["key2", "key5"], ["key3"]]

4
或者简单地写作h.group_by(&:last).map { |_,y| y.map(&:first) } - Niklas B.
1
@NiklasB。不错。我从来没有真正使用过group_by,所以甚至没有想到它。 - Andrew Marshall
@NiklasB。等等,我刚才意识到你编辑了使用“_”,我立即想到了Prolog,但在Ruby中它只是一个普通变量,对吧?(当然,在IRb中它也有特殊含义) - Andrew Marshall
1
不,它不是一个变量。它更像是一个占位符,表示:Ruby,丢弃那个值,我不需要它。这就是为什么 lambda { |x,x| 3 } 失败,而 lambda { |_,_| 3 } 成功的原因。 - Niklas B.
@NiklasB。同意,这很奇怪。我现在正在挖掘Ruby源代码,试图找到它。考虑到这是真正有趣的,我正在考虑提出一个问题。Prolog中“_”代表“不关心”是一个很好的特性(显然缺乏一致性使其更有用),很高兴发现它也存在于Ruby中。 - Andrew Marshall
显示剩余5条评论

3
hash = {
  "key" => "value1",
  "key2" => "value2",
  "key3" => "value3",
  "key4" => "value1",
  "key5" => "value2"
}

hash.group_by { |key, value| value }.values.map { |pairs| pairs.map &:first }

# => [["key", "key4"], ["key2", "key5"], ["key3"]]

0
hash.group_by{|k,v| v}.map{|k,v| v.reduce([]){|res,n| res << n.first}}

1
reduce 可以简单地写成 v.map(&:first) - Niklas B.

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接