ruby - 用值交换散列键并将键转换为 Ruby 中的符号?

标签 ruby loops hash

这是输入哈希:

p Score.periods #{"q1"=>0, "q2"=>1, "q3"=>2, "q4"=>3, "h1"=>4, "h2"=>5}

这是我当前的代码,用于将键与值交换,同时将键转换为符号:

periods = Score.periods.inject({}) do |hsh,(k,v)|
  hsh[v] = k.to_sym
  hsh
end

结果如下:

p periods #{0=>:q1, 1=>:q2, 2=>:q3, 3=>:q4, 4=>:h1, 5=>:h2}

看起来我的代码很笨重,不应该用 4 行代码来完成我在这里所做的事情。有没有更简洁的方式来写这个?

最佳答案

你可以这样做:

Hash[periods.values.zip(periods.keys.map(&:to_sym))]

或者,如果您使用的是 to_h 的 Ruby 版本可用于数组,你可以这样做:

periods.values.zip(periods.keys.map(&:to_sym)).to_h

上面两个例子所做的是将原始散列的键和值组成数组。请注意,哈希的字符串键通过将 to_sym 作为 Proc 传递给 map 映射到符号:

periods.keys.map(&:to_sym)
# => [:q1, :q2, :q3, :q4, :h1, :h2]

periods.values
# => [0, 1, 2, 3, 4, 5]

然后它将它们压缩成一个 [value, key] 对数组,其中 values 的每个对应元素都与 keys 中的对应键匹配:

periods.values.zip(periods.keys.map(&:to_sym))
# => [[0, :q1], [1, :q2], [2, :q3], [3, :q4], [4, :h1], [5, :h2]]

然后可以使用 Hash[array]array.to_h 将该数组转换回散列。

关于ruby - 用值交换散列键并将键转换为 Ruby 中的符号?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22975729/

相关文章:

ruby-on-rails - 如何关闭 Rack 应用程序?

ruby-on-rails - 在 docker 容器中使用像 RVM 这样的版本管理器是一种不好的做法吗?

loops - 有没有办法迭代一系列整数?

linux - 循环 Bash Shell 脚本

java - 在java中使用散列来匹配模式

arrays - 我应该选择散列、对象还是数组来表示 Perl 中的数据实例?

ruby-on-rails - Ruby On Rails,信誉系统

ruby-on-rails - 如何将回形针与服务器上已有的文件一起使用?

javascript - 如何重用 for 循环,其中数组每次索引都不同

ruby - 数组到哈希转换的更好方法