加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

Lua:在给定符号列表的情况下迭代每个可能的k长度字符串

发布时间:2020-12-15 00:16:27 所属栏目:大数据 来源:网络整理
导读:我想在给定符号列表的情况下迭代每个可能的k长度字符串(称为k-mer).例如,如果k = 3且symbols = {A,C,G,T},则: AAAAACAAG...TTGTTT 这是我生成字符串的代码: local k = 3local bases = {'A','C','T','G'}-- Generate the string (AAA...AAA)local kmer_gen
我想在给定符号列表的情况下迭代每个可能的k长度字符串(称为k-mer).例如,如果k = 3且symbols = {A,C,G,T},则:
AAA
AAC
AAG
...
TTG
TTT

这是我生成字符串的代码:

local k = 3
local bases = {'A','C','T','G'}

-- Generate the string (AAA...AAA)
local kmer_gen = {}
for i = 1,k do kmer_gen[i] = "A" end
local kmer = table.concat(kmer_gen)

它有效,但肯定不好看.这可以更优雅地实现吗?

现在,我不知道如何迭代可能的k-mers.一种解决方案是保持替换每个字符,但这看不到有效.另一种方法是从二进制解码(每2位代表一个基数),但实现混乱并需要按位操作.还有其他想法吗?

解决方法

这是一个使用迭代器的解决方案.这是协同程序的一个很好的例子,这是一种值得在Lua中了解的技术.另见 http://www.lua.org/pil/9.3.html.
local bases = {'A','G'}

local function allstrings(n,t,k,s)
    k=k or 1
    s=s or {}
    if k>n then
        coroutine.yield(table.concat(s))
    else
        for i=1,#t do
            s[k]=t[i]
            allstrings(n,k+1,s)
        end
    end
end

local function kmer(n,t)
    return coroutine.wrap(allstrings),n,t
end

for w in kmer(3,bases) do
    print(w)
end

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读