0

我有一个来自长脚本的方法,可以从基因序列中创建一个哈希,但是它真的很混乱,因此我想知道是否有一种方法可以更优雅地表达它。

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

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 方法...

非常感谢

4

1 回答 1

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

如果(看起来)id并且seq两者都有常量值,您可以考虑手动将它们分开,而不是使用id.split("~").map(&:strip); IE,

  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”)并将它们移到方法定义之外。毫不奇怪,续行也适用于常量字符串。

于 2013-11-05T21:58:08.013 回答