【问题标题】:Building a hash of hashes to determine largest numerical value in ruby构建哈希哈希以确定红宝石中的最大数值
【发布时间】:2010-11-18 01:14:20
【问题描述】:

我有一个如下所示的数据文件:

FBpp0070000 acyr193594273 acyr 866
FBpp0070000 acyr193577824 acyr 536
FBpp0070000 acyr193693009 acyr 445
FBpp0070000 bomb193605819 bomb 503
FBpp0070000 bomb193676398 bomb 101
FBpp0070001 acyr193618043 acyr 316
FBpp0070001 acyr193617997 acyr 313
FBpp0070001 bomb193638865 bomb 482
FBpp0070001 locu193695159 locu 220
FBpp0070001 locu193638863 locu 220

数据文件的长度约为 45,000 行。

我的目标是:

FBpp0070000 acyr193594273 acyr 866
FBpp0070000 bomb193605819 bomb 503
FBpp0070001 acyr193618043 acyr 316
FBpp0070001 bomb193638865 bomb 482
FBpp0070001 locu193695159 locu 220

也就是说,对于第 3 列中的每个不同值,对于第 1 列中的每个值,只保留第 4 列中得分最高的那些行。

此外,我看到的问题是 1)第 1 列中有多个重复的“键”和 2)第 4 列中的“分数”相等;我只想保留该重复“分数”的一个实例。

过去,我在 perl 中构建了一个可以处理多个重复键的哈希。

到目前为止,这是我在 ruby​​ 中所拥有的。

hash = Hash.new{|h,k| h[k]=Hash.new(&h.default_proc) }  
title = ''

File.open('test1.txt', 'r').each do |line|
  line.chomp!

     query, hit, taxa, score = line.split(/\s/)
     hash[query][hit][taxa] = score

 # end

#p "#{query}: #{taxa}: #{score}"

end
p hash

所以,我希望有人可以帮助我确定 1)我是否确实正确地处理了这个问题,以及 2)如果是,如何提取我需要的行。

谢谢。

【问题讨论】:

    标签: ruby hash-of-hashes


    【解决方案1】:

    鉴于您在上面给出的输入示例,以下内容似乎可以满足您的需求。您需要在最后使用数据以获得所需的输出格式。

    #!/usr/bin/env ruby
    
    require 'pp'
    
    data = {}
    File.open("input.txt", "r").each do |l| 
      l.chomp!
      query, hit, taxa, score = l.split(/\s+/)
      data[query] ||= {}
      data[query][taxa] ||= [0, nil]
      data[query][taxa] = [score.to_i, hit] if score.to_i > data[query][taxa].first
    end 
    
    pp data
    

    这给出了:

    dj2@Magnus:~/Development/test $ ./out.rb 
    {"FBpp0070000"=>
      {"bomb"=>[503, "bomb193605819"], "acyr"=>[866, "acyr193594273"]},
     "FBpp0070001"=>
      {"bomb"=>[482, "bomb193638865"],
       "locu"=>[220, "locu193695159"],
       "acyr"=>[316, "acyr193618043"]}}
    

    【讨论】:

    • dj2,非常感谢您的帮助!!!我明天会弄清楚如何排序。我真的很感激。
    猜你喜欢
    • 2014-11-01
    • 2012-12-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-10
    • 1970-01-01
    • 2015-12-03
    • 1970-01-01
    相关资源
    最近更新 更多