我有两个序列,我想得到它们之间的序列,以区分彼此的序列

时间:2014-04-20 02:51:54

标签: python substring

我有两个序列S和R. 我想在S中寻找区别于R的子串。这意味着在R中找不到子串。我想对R做同样的事。我想在R中找到不在S中的子串。

Example:
S='acctac'
R='gtgact'

Desired output:
SR=[cc,ta]
RS=[gt,tg,ga,act]

其中SR是S hat中的区分子串的集合不在R中 和RS是R中不在S

中的子串

注意:如果子字符串中包含另一个也正在分散的子字符串,则子字符串无法区分。

有什么建议吗?在python中 应该构建程序,以便可以对不同长度的序列进行编程。

2 个答案:

答案 0 :(得分:0)

我终于来了!弄清楚了。以下工作:(虽然我承认可能对于更长的序列来说有点慢。请试一试并告诉我们)

S='acctac'
R='gtgact'

lst = [S[subs:subs+i] for i in range(2, len(S)) for subs in range(len(S)-i+1) if S[subs:subs+i] not in R]

lst2 = [R[subs:subs+i] for i in range(2, len(R)) for subs in range(len(R)-i+1) if R[subs:subs+i] not in S]

lst = list(set([item for item in lst if all(j not in item for j in lst if j!=item)]))

lst2 = list(set([item for item in lst2 if all(j not in item for j in lst2 if j!=item)]))

>>> print lst
['cc', 'ta']

>>> print lst2
['gt', 'tg', 'ga', 'act']

答案 1 :(得分:0)

嗯,这是一个使用相同长度的子串的简单方法。

def substr_of_len(n, s):
        return [s[x:x + n] for x in range(0, len(s) - n + 1)]

print [x for x in substr_of_len(2, 'gtgact') if x not in substr_of_len(2, 'acctac')]
>>> ['gt', 'tg', 'ga']

print [x for x in substr_of_len(2, 'acctac') if x not in substr_of_len(2, 'gtgact')]
>>> ['cc', 'ta']

print [x for x in substr_of_len(3, 'gtgact') if x not in substr_of_len(3, 'acctac')]
>>> ['gtg', 'tga', 'gac', 'act']

print [x for x in substr_of_len(3, 'acctac') if x not in substr_of_len(3, 'gtgact')]
>>> ['acc', 'cct', 'cta', 'tac']