有没有更简洁的方法来放置这些哈希/数组?

时间:2013-11-05 21:23:08

标签: ruby arrays hash

我有一个来自长脚本的方法,它从基因序列中创建一个哈希值,但它确实非常混乱,因此我想知道是否有办法让它更优雅。

以下是脚本的示例(即它包含一个示例)...

def make_hash(motif)
  main_hash = Hash.new
  id = ">isotig00009_f2_3 ~: S.P. Cleavage Site: 22:23 - S.P. D-value: 0.532"
  seq = "MLKCFSIIMGLILLLEIGGGCA~IYFYRAQIQAQFQKSLTDVTITDYRENADFQDLIDALQSGLSCCGVNSYEDWDNNIYFNCSGPANNPEALWCAFLLLYTGSSKRSSQHPVRLWSSFPRTTKYFPHKDLHHWLCGYVYNVD"

  id_hash = Hash[[[:id_start, :id_end], id.split("~").map(&:strip)].transpose]
  seq_hash = Hash[[[:signalp, :seq_end], seq.split("~").map(&:strip)].transpose]

  signalp = seq_hash[:signalp] 
  new_seq_end = seq_hash[:seq_end].gsub(/#{motif}/, '<span class="motif">\0</span>')

  new_seq_hash = Hash[:signalp => signalp, :new_seq_end => new_seq_end ]

  main_hash[id_hash] = [new_seq_hash]
  return main_hash
end

motif = "VT|QAQ|F.D"
main_hash = make_hash(motif)

main_hash.each do |id_hash, seq_hash|
  puts id_hash[:id_start]
  puts id_hash[:id_end]
  puts seq_hash[0][:signalp] 
  puts seq_hash[0][:new_seq_end]
end

那么是否有更优雅的方式来编写make_hash方法...

非常感谢

1 个答案:

答案 0 :(得分:1)

我没有对此进行过测试,但我认为这种简化会起作用:

def make_hash(motif)
  id = ">isotig00009_f2_3 ~: S.P. Cleavage Site: 22:23 - S.P. D-value: 0.532"
  seq = "MLKCFSIIMGLILLLEIGGGCA~IYFYRAQIQAQFQKSLTDVTITDYRENADFQDLIDALQSGLSCCGVNSYEDWDNNIYFNCSGPANNPEALWCAFLLLYTGSSKRSSQHPVRLWSSFPRTTKYFPHKDLHHWLCGYVYNVD"

  id_hash = Hash[[[:id_start, :id_end], id.split("~").map(&:strip)].transpose]

  f, s = seq.split("~").map(&:strip)
  s.gsub!(/#{motif}/, '<span class="motif">\0</span>')

  new_seq_hash = Hash[Hash[:signalp, f], Hash[:new_seq_end, s]]

  Hash[id_hash, new_seq_hash]
end

如果(显示)idseq都具有常量值,您可以考虑手动将它们分开,而不是id.split("~").map(&:strip);即,

  id1  = ">isotig00009_f2_3
  id2  = ": S.P. Cleavage Site: 22:23 - S.P. D-value: 0.532"
  seq1 = "MLKCFSIIMGLILLLEIGGGCA"
  seq2 = "IYFYRAQIQAQFQKSLTDVTITDYRENADFQDLIDALQSGLSCCGVNSYEDWDNNIYFNCSGPANNPEALWCAFLLLYTGSSKRSSQHPVRLWSSFPRTTKYFPHKDLHHWLCGYVYNVD"

如果需要使seq2更具可读性,我们可以使用“行继续”字符\(甚至可以在字符串中使用),如下所示:

  seq2 = "IYFYRAQIQAQFQKSLTDVTITDYRENADFQDLIDALQSGLSCCGVNSYEDWDNNIYFNC"\
         "SGPANNPEALWCAFLLLYTGSSKRSSQHPVRLWSSFPRTTKYFPHKDLHHWLCGYVYNVD"

或者这个:

  seq2 = "IYFYRAQIQAQFQKSLTDVTITDYRENADFQDLIDALQSGLSCCGVNSYEDWDNNIYFNC\
SGPANNPEALWCAFLLLYTGSSKRSSQHPVRLWSSFPRTTKYFPHKDLHHWLCGYVYNVD"

如果您愿意,可以制作'id'和'seq'常量('ID'和'SEQ',比如说)并将它们移到方法定义之外。毫不奇怪,行继续也适用于常量字符串。

相关问题