Rosalind 的 - 'Ordering Strings of Varying Length Lexicographically' 是否可以对我的结果进行排序?

Rosalind's - 'Ordering Strings of Varying Length Lexicographically' Is it possible to sort my result?

我试图自己解决 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 的 'Sample input' 获取数据的结果是:

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) 是否可以按应有的顺序排列我的结果(罗莎琳德的结果)?

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

非常感谢!

生成可能的子字符串

为了生成可能的子字符串,我会更深入地研究 itertools 模块。使用 chainproduct 您可以轻松地制作一行 returns 所有组合

正在排序

为了排序,我会用 int 替换字母本身,将翻译 table 保留在 dict 中。 enumeratestr.split 是你的朋友。

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

当你有一个排序的元组列表时,你只需要向后翻译成字符串

排序(键=)

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

这可以通过 str.translateenumeratedict 理解来完成