Julia 如何找到多个';主题';按顺序?

Julia 如何找到多个';主题';按顺序?,julia,Julia,我正在学习Julia,但在R之外的编程经验相对较少。我直接从rosalind.info获取这个问题,如果您想了解更多细节,可以找到它 我已经给出了两个字符串:一个motif和一个序列,其中motif是序列的子串,我的任务是找出子串开始位置的索引,不管它在序列中被找到多少次 例如: 序列:“GATATATGCATATACTT” 主题:“阿塔特” ATAT被发现三次,一次从索引2开始,一次在索引4,一次在索引10。这是假设基于1的索引。因此,最终输出将是:2410 以下是我目前掌握的情况: f =

我正在学习Julia,但在R之外的编程经验相对较少。我直接从rosalind.info获取这个问题,如果您想了解更多细节,可以找到它

我已经给出了两个字符串:一个motif和一个序列,其中motif是序列的子串,我的任务是找出子串开始位置的索引,不管它在序列中被找到多少次

例如:

序列:“GATATATGCATATACTT”

主题:“阿塔特”

ATAT被发现三次,一次从索引2开始,一次在索引4,一次在索引10。这是假设基于1的索引。因此,最终输出将是:2410

以下是我目前掌握的情况:

f = open("motifs.txt")
stream = readlines(f)

sequence = chomp(stream[1])
motif = chomp(stream[2])

println("Sequence: $sequence")
println("Motif: $motif")

result = searchindex(sequence, motif)
println("$result")

close(f)

我的主要问题似乎是没有searchindexall选项。当前脚本为我提供了第一次遇到motif时的第一个索引(索引2),我尝试了各种各样的for循环,但都没有成功,因此我希望有人能给我一些关于这方面的见解。

这里有一个关于while循环的解决方案:

sequence = "GATATATGCATATACTT"
motif = "ATAT"

function find_indices(sequence, motif)
    # initalise empty array of integers
    found_indices = Array{Int, 1}()

    # set initial values for search helpers
    start_at = 1

    while true
      # search string for occurrence of motif
      result = searchindex(sequence, motif, start_at)

      # if motif not found, terminate while loop
      result == 0 && break

      # add new index to results
      push!(found_indices, result-1+start_at)
      start_at += result + 1
   end

   return found_indices
end
这将提供您想要的:

>find_indices(sequence, motif)
2
4
10

如果性能不是那么重要,正则表达式可能是一个不错的选择

julia> map(x->x.offset, eachmatch(r"ATAT", "GATATATGCATATACTT", true))
3-element Array{Any,1}:
  2
  4
 10
注:
eachmatch
的第三个参数表示“重叠”,不要忘记将其设置为真


如果需要更好的性能,也许您应该花一些时间实现这样的算法。

这非常有效。所以你基本上让searchindex从不同的索引开始,这样它就不会总是回到索引1,对吗?这是有道理的。谢谢大家!@系统,对。它就是这样做的。很高兴它能为您工作。通过使用
searchindex
的3参数形式,该函数可以变得更简单、更快,因此不需要切片。例如,
searchindex(sequence,motif,start_at)
另外,一个典型的Julia习惯用法是
result==0&&break
。while循环应该是
while true
,甚至不需要在循环之前设置
结果。增量可以是
start\u at+=result+1
。一个风格问题,通常只将
找到的索引
作为最后一行,或者
返回找到的索引
,不需要额外的参数。尽管如此,这还是一个值得回答的问题。@ScottJones谢谢你的提示。向更有经验的人学习总是好的。我更新了我的答案以反映你的建议。谢谢,我真的很感激。我刚刚意识到它可以变得更简单,即:
函数find_index(sequence,motif)#初始化找到的整数的空数组_index=Vector{Int}()#设置搜索助手pos=0的初始位置#循环,直到在(pos=searchindex)时不再出现motif为止(顺序,主题,位置+=1))!=0推送!(找到索引,位置)#将新索引添加到结果结尾找到索引结尾
(不知道如何在注释中插入代码块!)