Ruby编程:如何将哈希值数组转为平均值?能否不新建哈希?
当然有更优雅的实现方式啦!Ruby本身就提供了很方便的方法来处理这种哈希值转换的场景,分两种情况给你说明:
更优的实现方案
1. 原地修改原哈希(完全无需创建新哈希)
如果你希望直接修改原哈希hash_1,不需要额外创建hash_2,可以用Ruby的transform_values!方法(Ruby 2.4及以上版本支持),这是专门为哈希值批量原地更新设计的API,代码超简洁:
hash_1 = {"Luke"=> [2,3,4], "Mark"=>[3,5], "Jack"=>[2]} hash_1.transform_values! { |values| values.sum / values.count } # 此时hash_1已经变成目标结果:{"Luke"=>3, "Mark"=>4, "Jack"=>2}
如果你的Ruby版本比较旧,也可以用each直接原地更新,虽然代码稍长但同样不需要新哈希:
hash_1.each do |key, values| hash_1[key] = values.sum / values.count end
2. 生成新哈希(不改动原哈希)
如果你不想修改原哈希,想要得到一个全新的结果哈希,可以用不带感叹号的transform_values方法,它会返回转换后的新哈希,原哈希保持不变:
hash_1 = {"Luke"=> [2,3,4], "Mark"=>[3,5], "Jack"=>[2]} result_hash = hash_1.transform_values { |values| values.sum / values.count } # result_hash是目标结果,hash_1依然是初始状态
小补充
如果需要浮点数类型的平均值(比如数组是[1,2]时得到1.5而不是1),只需要把求和结果转成浮点数即可:
hash_1.transform_values! { |values| values.sum.to_f / values.count }
内容的提问来源于stack exchange,提问作者Gtchweb
相关产品推荐
相关产品推荐

