【问题标题】:Iterate over a hash using keys from an array, and sum the results使用数组中的键迭代哈希,并对结果求和
【发布时间】:2016-01-31 08:31:28
【问题描述】:

我有一个 Hash 将一堆 ID 索引到一个值,例如:

hash = {1: 3.00, 2: 4.00, 3: 2.00, 4: 15.00, 5: 12.00, 6: 1.00}

我有一个如下所示的数组:

arr = [2, 3, 6]

什么是一种简短的 Ruby 惯用方式来迭代我的 Array 并将 Hash 中相应键的累积总数相加?

上面的结果等于:

4.00 + 2.00 + 1.00 == 7.00

【问题讨论】:

  • 这个问题是在三个多星期前发布的。有趣的是,没有人指出hash 不是有效对象。语法{ 1: 2 }{:1=>2} 的简写,但符号不能以数字开头。 {"1": 2} 可以,但我怀疑你的意思是 ( 1=>2 }。此外,写入小数点后两位或多位数字的值(浮点数)也是没有意义的,最后一位是零,因为 Ruby 会丢弃最后的零。

标签: ruby ruby-2.2


【解决方案1】:
hash = {1=>3.0, 2=>4.0, 3=>2.0, 4=>15.0, 5=>12.0, 6=>1.0}
arr = [2, 3, 6]

arr.reduce(0) { |t,e| t + hash[e] }
   #=> 7.0

【讨论】:

  • 我坚持认为我的方式更加红宝石。你的可能更高效,但没有那么性感。 :)
  • 我们可以同意。请参阅我对这个问题的评论。
  • 哦该死的,从来没有注意到奇怪的键。
  • 您期待莫斯科的另一个冬天吗?我在渥太华住了几年,所以可以想象它是什么样的。在运河上滑冰很有趣,但我讨厌刺骨的寒冷,这似乎永远不会结束。
  • 莫斯科的冬天主要由破鞋组成(因为它们倾倒在道路上的所有化学物质都是为了防止结冰)。有点滑冰,如果你幸运的话。但大多是破鞋和半融化的雪泥水坑:)我期待吗?一定不行。 :)
【解决方案2】:
arr.map {|i| hash[i]}.reduce(:+)

【讨论】:

  • 虽然此答案可能是正确且有用的,但如果您 include some explanation along with it 解释它如何帮助解决问题,则最好。如果有更改(可能不相关)导致它停止工作并且用户需要了解它曾经是如何工作的,这在未来变得特别有用。
【解决方案3】:

您可能无法获得比这更多的 ruby​​-ish 了 :)

hash.values_at(*arr).reduce(:+)

【讨论】:

  • 他们在争吵。
猜你喜欢
  • 2019-04-06
  • 1970-01-01
  • 2014-12-15
  • 2011-05-26
  • 1970-01-01
  • 2013-04-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多