0

我试图自己解决另一个 Rosalind( http://rosalind.info/problems/lexv/ ) 问题,但不幸的是我不得不向你寻求帮助。

这是我的方法

首先; 创建长度为 n 的输入字符串的所有可能子字符串的函数:

def get_substrings(input_string, l):
res_list = []
sub = []
for i in range(len(input_string)):
    if l+i <= len(input_string):
        for j in range(i,l+i):
            sub.append(input_string[j])
    sub = ''.join(sub)
    res_list.append(sub)
    sub = []
res_list = filter(None, res_list)
return res_list

然后是创建具有不同长度的当前字符串的所有组合的主函数:

from itertools import product
def lexv():
dna = str(raw_input())
n = int(raw_input())
subs = get_substrings(dna, n)
result = []
for i in range(len(subs)):
    for j in range(1,n+1):
        result = result + list(product(dna, repeat=j))
for i in range(len(result)):
     result[i]  = "".join(result[i])
     print result[i]

我对来自 Rosalind 的“示例输入”的数据的代码的结果是:

D
N
A
DD
DN
DA
ND
NN
NA
AD
AN
AA
DDD
DDN
DDA
DND
DNN
DNA
DAD
DAN
DAA
NDD
NDN
NDA
NND
NNN
NNA
NAD
NAN
NAA
ADD
ADN
ADA
AND
ANN
ANA
AAD
AAN
AAA

我的问题:

a) 是否可以按原样订购我的结果(Rosalind 的结果)?

b) 我的方法正确吗?如果没有,你能给我一些线索(但不是这个问题的解决方案——我想自己解决)。

很感谢!

4

1 回答 1

2

生成可能的子串

对于可能的子字符串的生成,我会更深入地研究itertools模块。和你可以很容易chainproduct制作一个返回所有组合的单行

排序

对于排序,我会用ints 替换字母本身,将这个翻译表保存在 a 中dictenumerate并且str.split是你这里的朋友。

现在您有一个整数元组列表,您可以对其进行排序。据我所知,元组的标准排序顺序很有用。

当您有一个排序的元组列表时,您只需要向后转换为字符串

排序(键=)

另一种选择是使用标准字符串排序,并作为 的key=参数sorted,传递一个函数(或 lambda),将字符串中的每个字母替换为它在字母表中的位置(input_string

这可以通过str.translate,enumeratedict理解来完成

于 2017-06-23T13:26:32.237 回答