在散列中交换键和值?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (25)

在Ruby中,如何在哈希上交换键和值?

假设我有以下哈希:

{:a=>:one, :b=>:two, :c=>:three}

我想转化为:

{:one=>:a, :two=>:b, :three=>:c}

提问于
用户回答回答于

允许将哈希视为倒置。

{a: 1, b: 2, c: 3}.key(1)
=> :a

如果想保留倒置散列

{a: 1, b: 2, c: 3}.invert
=> {1=>:a, 2=>:b, 3=>:c}

如果有重复的值,invert

{a: 1, b: 2, c: 2}.key(2)
=> :b

{a: 1, b: 2, c: 2}.invert
=> {1=>:a, 2=>:c}

可以用Hash#invert如果没有,则可以将所有值保留为数组,如下所示:

class Hash
  # like invert but not lossy
  # {"one"=>1,"two"=>2, "1"=>1, "2"=>2}.inverse => {1=>["one", "1"], 2=>["two", "2"]} 
  def safe_invert
    each_with_object({}) do |(key,value),out| 
      out[value] ||= []
      out[value] << key
    end
  end
end

或者

class Hash
  def safe_invert
    self.each_with_object({}){|(k,v),o|(o[v]||=[])<<k}
  end
end
用户回答回答于

在Ruby中

{a: :one, b: :two, c: :three}.invert
=> {:one=>:a, :two=>:b, :three=>:c}

扫码关注云+社区