所以我有一个Peptide,它是一串字母,对应于氨基酸 说肽是
peptide_sequence = "VEILANDQGNR"
L 位置 4 , R 位置 11 ,
我想在这些位置之前和之后同时插入"<span class=\"modified_aa\">
和</span>
。
以下是我的尝试:
我的修改存储在对象修改的数组pep_mods
中,其中包含具有位置的属性位置,在本例中为4和11
pep_mods.each do |m|
peptide_sequence.gsub(peptide_sequence[m.position.to_i-1], "<span class=\"mod\">#{@peptide_sequence[m.location.to_i-1]}</span>" )
end
但是,由于在第一次插入html span标签后有两处修改,字符串中的位置变得完全不同
我怎样才能实现我打算做的事情?我希望很清楚
答案 0 :(得分:3)
你应该倒退 - 从最后一个开始进行修改。这样,早期修改的索引就不会改变。
您可能需要以相反的顺序对索引数组进行排序 - 然后您可以使用当前的代码。
答案 1 :(得分:1)
Floris的回答是正确的,但如果你想这么做(O(n^2)
而不是O(nlgn)
),这就是基本的想法。
如果每个字符都有一个与其中一个修改对应的索引,则可以迭代字符检查,而不是依赖gsub
。如果索引匹配,请执行修改。否则,请保留原始字符。
modified = peptide_sequence.each_with_index
.to_a
.map do |c, i|
pep_mods.each do |m|
if m.location.to_i = i
%Q{<span class="mod">#{c}</span>}
else
c
end
end
end.join('')
答案 2 :(得分:0)
好的,以防这对其他人有帮助,这就是我最终做到的方式:
我首先将肽序列转换为数组:
pep_seq_arr = peptide_sequence.split("")
然后使用each_with_index
作为Casey提到的
pep_seq_arr.each_with_index do |aa, i|
pep_mods.each do |m|
pep_seq_arr[i] = "<span class='mod'>#{aa}</span>" if i == m.location.to_i-1
end
end
最后加入了数组:
pep_seq_arr.join
比我初想的容易