【问题标题】:Finding unique strings of characters in each sequence在每个序列中查找唯一的字符串
【发布时间】:2015-12-07 20:44:01
【问题描述】:

我正在尝试创建一个程序,该程序将多个 tRNA 序列存储为字典。我已经设置了我的代码来提取和存储序列以及与序列关联的特定名称:

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)

我正在调用 sites 函数(这就是为什么它作为第一步运行得更干净),但我不知道如何编写代码以在每个存储的序列中找到唯一的字符串。

例如,如果我有 2 组序列:

  1. UCGUUAGC
  2. AGCGCAUU

程序会告诉我第一个序列的唯一字符串是UCG,第二个是AGC,因为UCG 只出现在第一个序列中,AGC 只出现在第二个序列中.

编辑:我所说的唯一序列是什么意思:我可以看到并自动知道它来自哪个序列的任何序列链。因此,如果链UCGA 仅存在于一个序列中,则将其计数并保存为与该序列相关的唯一链。

提取的序列如下所示:

GAGAGAGACAUAGAGGDUAUGAPGPPGG'UUGAACCAAUAGUAGGGGGUPCG"UUCCUUCCUUUCUUACCA

【问题讨论】:

  • CGU也是第一个序列中唯一的字符串,不是吗?
  • 有很多独特的序列没有命名。您应该澄清您对唯一性和序列的定义。总是3个字符吗?它可以从任何时候开始吗?
  • @KlausD.it 不一定必须是 3 个字符,只要是每个序列唯一的字符组合即可。我希望我的编辑能澄清我的意思
  • 所以,如果从 U 开始,我会在序列 1 中使用 UCUCGUCGUUCGUUUCGUUAUCGUUAGUCGUUAGC
  • 我刚刚注意到AGC 在你的两个序列中,所以你的例子有点错误。

标签: python python-3.x unique bioinformatics


【解决方案1】:

所以,如果我理解正确,你想要序列 B 中不存在的序列 A 的所有子字符串。

这可以使用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

更新: 正如 cmets 中所指出的,我复制的 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]) 

【讨论】:

  • 非常感谢您的回复!只有一个问题:这会以自动化的方式工作吗?因为我的实际程序中有超过 2 个序列。因此,在比较 seq1 时,它会将其与 50 多个其他序列进行比较。
  • @PadraicCunningham - 生成器版本在另一篇文章的链接中,但我认为有现成的列表是可以的。而a.difference(b) 等价于a - b
  • @cricket_007, a.difference(get_all_substrings('AGCGCAUU'))) 是不一样的,如果你有大量数据,你的代码不会运行得很好,如果你想找到两个 symmetric_difference 的独特之处跨度>
  • @PadraicCunningham - 当然不一样,get_all_substrings 返回一个列表,而不是一个集合
  • @cricket_007 你知道方法调用实际上是如何工作的吗?您也许应该阅读有关 python 集的文档
猜你喜欢
  • 2012-06-30
  • 1970-01-01
  • 1970-01-01
  • 2020-01-22
  • 1970-01-01
  • 1970-01-01
  • 2021-09-26
  • 1970-01-01
相关资源
最近更新 更多