ルビーの最大数値値を決定するためにハッシュのハッシュを構築する

StackOverflow https://stackoverflow.com/questions/4207026

  •  25-09-2019
  •  | 
  •  

質問

私は次のように見えるデータファイルを持っています:

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の「スコア」と等しい。その複製の「スコア」のインスタンスを1つだけ保持したいと思います。

過去に、複数の重複キーを処理できるハッシュを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)もしそうなら、私が必要とする線を抽出する方法。

ありがとう。

役に立ちましたか?

解決

上記の入力例を考えると、以下はあなたが望むことをしているようです。必要な出力形式を取得するには、最後にデータをリゾートする必要があります。

#!/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"]}}
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top