【问题标题】:How could I do the sum of all values of a nested hash?如何计算嵌套哈希的所有值的总和?
【发布时间】:2020-07-06 20:09:50
【问题描述】:

我有一个这样的嵌套哈希

Aranea={
  "Aranéomorphes"=>{
    "Agelenidae"=>[80,1327],
"Amaurobiidae"=>[49,270],
"Ammoxenidae"=>[4,18],
"Anapidae"=>[58,233],
"Anyphaenidae"=>[56,572],
"Araneidae"=>[175,3074],
"Archaeidae"=>[5,90],
"Arkydiae"=>[2,38],
"Austrochilidae"=>[3,10],
"Caponiidae"=>[18,119],
"Cheiracanthiidae"=>[12,353],
"Cithaeronidae"=>[2,8],
"Clubionidae"=>[16,639],
"Corinnidae"=>[68,489],
"Ctenidae"=>[48,519],......

对于每个键(蜘蛛家族),数组表示[性别数,物种数]。

我想得到所有第一个元素的总和......即所有性别的总和......

我尝试了不同的方法但没有成功,例如:

genre = []

#total = genre.transpose.map {|x| x.reduce(:+)}

或者....

def sum_deeply(h)
  h.values.inject(0) { |m, v| 
    m + (Hash === v[0] ? sum_deeply(v[0]) : v[0].to_i) 
  } 
end
puts sum_deeply(Aranea)

但是没有一个适用于转置我得到一个没有隐式转换错误...

任何人都可以启发我吗?谢谢

!!!更新.... 08.07.2020... 找到解决方案

families = Aranea
num_genders = families.flat_map do |_family_name, species_hash|
  num_genders, _num_species = species_hash.values.transpose
  num_genders

感谢 Kache 在这方面的帮助。

【问题讨论】:

    标签: arrays ruby hash sum


    【解决方案1】:

    这应该做你想做的:

    families = Aranea
    num_genders = families.flat_map do |_family_name, species_hash|
      num_genders, _num_species = species_hash.values.transpose
      num_genders
    end
    num_genders.inject(:+)
    

    提示:将“数据提取”和“数据处理”分开(即访问 num_genders 值与对它们求和)将使您的代码更易于理解。

    我认为上面的任何部分您都不会理解,但如果有,请告诉我您想要解释的部分。

    【讨论】:

    • 谢谢...只是一个问题,我的哈希值是 Aranea={Araneomorphes=>{"Agelenidae"=>[80,1327], "Amaurobiidae"=>[49,270], "Ammoxenidae"=> [4,18] 等等 .. 等等... 我应该用 Aranea 或 Aranea[Araneomorphes] 替换您的代码系列吗?我真的不明白。谢谢
    • 您的Aranea 哈希是蜘蛛家族的Hash,因此得名families。可以创建新变量来引用相同的数据,例如families = Aranea.
    • 我还重命名了一些变量以更明确,我现在使用transpose 而不是map(&:first),因为您在您的问题中表达了使用该方法的意图。这有帮助吗?
    • 感谢它帮助很大。我确实得到了性别总数。我做对了。但是如果我确实想要物种总数...我应该这样做吗:family = Aranea num_genders =family.flat_map do |_family_name, species_hash| num_genders, _num_species = species_hash.values.transpose num_species end num_species.inject(:+) ?
    • 那你会赞成并接受我的回答吗?我会很感激的
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-10
    • 1970-01-01
    • 2015-05-10
    • 2015-12-06
    • 2015-04-16
    • 2011-02-14
    相关资源
    最近更新 更多