我正在尝试创建一个程序,该程序将多个tRNA序列存储为字典。我已经设置了我的代码来提取和存储序列以及与序列相关的特定名称:
Safari/7046A194A
我正在调用网站功能(这就是为什么它运行起来更干净的第一步),但是我很遗憾如何编写代码来查找每个存储序列中的唯一字符串。
例如,如果我有两组序列:
class Unique():
def __init__(self, seq = ''):
for s in range(len(seq)):
for e in range(s + 1, len(seq) + 1):
self.add(seq[s:e])
self.head = head
self.sequence = seq
self.original = {}
def cleaner(self):
for (header, sequence) in myReader.readFasta():
clean = sequence.replace('-','').replace('_','')
self.original[self.head] = clean
return self.original
def sites(self):
Unique.cleaner(self)
UCGUUAGC
该程序可以告诉我第一个序列的唯一字符串是AGCGCAUU
,而第二个字符串是UCG
,因为AGC
仅存在在第一个序列中,UCG
仅存在于第二个序列中。
AGC
仅存在于一个序列中,则将其计数并保存为与该序列关联的唯一链。
提取的序列如下所示:
UCGA
答案 0 :(得分:1)
因此,如果我理解正确,你想要序列A的所有子串在序列B中不存在。
使用set complement or difference可以轻松实现这一目标。
I "stole" some code from another answer。
def get_all_substrings(input_string):
length = len(input_string)
return [input_string[i:j+1] for i in xrange(length) for j in xrange(i,length)]
# convert these to sets to remove duplicate substrings
seq1 = set(get_all_substrings('UCGUUAGC'))
seq2 = set(get_all_substrings('AGCGCAUU'))
unique_seq1 = seq1 - seq2 # those sequences that are in seq1, and not in seq2
unique_seq2 = seq2 - seq1 # those sequences that are in seq2, and not in seq1
<强>更新强>
正如评论中所指出的那样,我复制的get_all_substrings
方法会在内存中消耗掉大字符串,这个版本更加流行,因为它懒得获得下一个子字符串
def get_all_substrings(string):
length = len(string)
for i in xrange(length):
for j in xrange(i + 1, length + 1):
yield(string[i:j])