Ruby 哈希转置

发布于 2024-10-01 13:34:17 字数 397 浏览 1 评论 0原文

我有以下 ruby​​ 哈希:

 h = { i1: { q1: 1, q2:2 }, i2: { q1: 3, q2: 4} }

我想将其转置如下:

{ q1: { i1: 1, i2: 3 }, q2: { i1: 2, i2: 4 } }

现在,我想出了一个可以完成我想要的功能的函数, 但我想知道是否有更简洁/优雅的方式来完成同样的事情?

我的解决方案:

 ht = Hash.new{ |h,k| h[k] = {} }

 h.each_pair do |k,ih| 
   ih.each_pair{ |ik, iv| ht[ik][k] = iv }
 end

I have the following ruby hash:

 h = { i1: { q1: 1, q2:2 }, i2: { q1: 3, q2: 4} }

and I want to transpose it as follows:

{ q1: { i1: 1, i2: 3 }, q2: { i1: 2, i2: 4 } }

Now, I came up with a function that does what I want,
but I wonder if there is a more succinct/elegant way for the same thing?

My solution:

 ht = Hash.new{ |h,k| h[k] = {} }

 h.each_pair do |k,ih| 
   ih.each_pair{ |ik, iv| ht[ik][k] = iv }
 end

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

看轻我的陪伴 2024-10-08 13:34:17

如果你更喜欢inject,你可以将其写为

h.inject({}) do |a, (k, v)|
  v.inject(a) do |a1, (k1, v1)|
    a1[k1] ||= {}
    a1[k1][k] = v1
    a1
  end
  a
end

If you prefer inject, you can write it as

h.inject({}) do |a, (k, v)|
  v.inject(a) do |a1, (k1, v1)|
    a1[k1] ||= {}
    a1[k1][k] = v1
    a1
  end
  a
end
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文