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



我试图解决另一个Rosalind(http://rosolind.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]

我从罗莎琳德的"示例输入"的数据代码的结果是:

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(我的方法正确吗?如果没有,您能给我一些线索(,但不是解决这个问题的解决方案 - 我想一个人击败它(。

非常感谢!

生成可能的子字符串

对于可能产生的子字符串,我会更深入地研究itertools模块。使用chainproduct,您可以轻松地制作一个单线,以返回所有组合

排序

对于排序,我将用int s本身替换字母,将此翻译表保存在dict中。enumeratestr.split是您的朋友。

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

当您有一个分类的元组列表时,您只需要向后翻译为字符串

排序(key =(

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

可以使用str.translateenumeratedict理解

来完成此操作

最新更新