5

我有一串RNA,即:

AUGGCCAUA

我想通过以下方式生成所有子字符串:

#starting from 0 character
AUG, GCC, AUA
#starting from 1 character
UGG, CCA
#starting from 2 character
GGC, CAU

我写了一个解决第一个子问题的代码:

for i in range(0,len(rna)):
  if fmod(i,3)==0:
    print rna[i:i+3]

我试图改变起始位置,即:

 for i in range(1,len(rna)):

但它给我带来了不正确的结果:

 GCC, UA #instead of UGG, CCA

你能告诉我我的错误在哪里吗?

4

4 回答 4

8

您的代码的问题是您总是从可被 3 整除的索引中提取子字符串。相反,试试这个

a = 'AUGGCCAUA'
def getSubStrings(RNA, position):
    return [RNA[i:i+3] for i in range(position, len(RNA) - 2, 3)]

print getSubStrings(a, 0)
print getSubStrings(a, 1)
print getSubStrings(a, 2)

输出

['AUG', 'GCC', 'AUA']
['UGG', 'CCA']
['GGC', 'CAU']

解释

range(position, len(RNA) - 2, 3)将生成一个公差为 3 的数字列表,从position直到列表的长度 - 2 开始。例如,

print range(1, 8, 3)

1是起始数字,8是最后一个数字,3是公差,它将给出

[1, 4, 7]

这些是我们的起始索引。然后我们使用列表推导生成这样的新列表

[RNA[i:i+3] for i in range(position, len(RNA) - 2, 3)]
于 2013-11-10T17:49:53.640 回答
2

这是你要找的吗?

for i in range(len(rna)):
    if rna[i+3:]:
        print(rna[i:i+3])

输出:

AUG
UGG
GGC
GCC
CCA
CAU
于 2013-11-10T17:41:36.293 回答
1

我想到了这个oneliner:

a = 'AUGGCCAUA'
[a[x:x+3] for x in range(len(a))][:-2]
于 2013-11-10T17:43:50.693 回答
1
def generate(str, index):
    for i in range(index, len(str), 3):
        if len(str[i:i+3]) == 3:
            print str[i:i+3]

例子:

In [29]: generate(str, 1)
UGG
CCA

In [30]: generate(str, 0)
AUG
GCC
AUA
于 2013-11-10T17:48:22.907 回答