我试图自己解决另一个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
然后main函数创建具有不同长度的当前字符串的所有组合:
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&#39;样本输入数据代码的结果&#39;是:
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)我的方法是否正确?如果没有,你能否给我一些线索(但不是解决方案这个问题 - 我想自己打败它。)
非常感谢!
答案 0 :(得分:2)
为了生成可能的子串,我会更深入地研究itertools
模块。使用chain
和product
,您可以轻松制作返回所有组合的单行
对于排序,我会用int
替换字母本身,将此转换表保留在dict
中。 enumerate
和str.split
是您的朋友。
现在您有一个可以排序的整数元组列表。据我所知,元组的标准排序顺序很有用。
当你有一个排序的元组列表时,你只需要向后转换为字符串
另一种选择是使用标准字符串排序,并将key=
参数作为sorted
,传递一个函数(或lambda),将字符串中的每个字母替换为它中的每个字母。字母(input_string
)
可以使用str.translate
,enumerate
和dict
理解来完成此操作