我有一串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
你能不能给我一个暗示,我的错误在哪里?
答案 0 :(得分:6)
你的代码的问题在于你总是从索引中提取子字符串,该子字符串可以被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
开始直到列表的长度 - 例如,
print range(1, 8, 3)
1
是起始号码,8
是最后一个号码,3
是常见差异,它会给出
[1, 4, 7]
这些是我们的起始指数。然后我们使用list comprehension生成像这样的新列表
[RNA[i:i+3] for i in range(position, len(RNA) - 2, 3)]
答案 1 :(得分:2)
这是你要找的吗?
for i in range(len(rna)):
if rna[i+3:]:
print(rna[i:i+3])
输出:
AUG
UGG
GGC
GCC
CCA
CAU
答案 2 :(得分:1)
我想到了这个oneliner:
a = 'AUGGCCAUA'
[a[x:x+3] for x in range(len(a))][:-2]
答案 3 :(得分: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