Python编辑距离

时间:2012-07-12 20:13:11

标签: python sequence edit distance biopython

我是一名分子生物学家,使用Biopython分析基因突变,我的问题是:

我有一个包含许多不同序列(数百万)的文件,其中大多数都是重复的。我需要找到重复项并丢弃它们,保留每个唯一序列的一个副本。我打算使用模块editdist来计算它们之间的编辑距离,以确定重复项是哪些,但editdist只能使用2个字符串,而不是文件。

任何人都知道如何将该模块用于文件而不是字符串?

5 个答案:

答案 0 :(得分:2)

假设您的文件仅由每行排列一个序列的序列组成,我建议如下:

seq_file = open(#your file)

sequences = [seq for seq in seq_file]

uniques = list(set(sequences))

假设你有记忆。有几百万?

ETA:

正在阅读上面的评论(但没有评论权限) - 假设任何重复的序列ID都相同,这将有效。如果重复序列可以使用不同的序列ID,那么就知道哪个序列号首先出现,以及文件中它们之间的区别。

答案 1 :(得分:1)

如果要过滤掉完全重复的内容,可以使用set Python内置类型。举个例子:

a = ["tccggatcc", "actcctgct", "tccggatcc"] # You have a list of sequences
s = set(a) # Put that into a set

s等于['tccggatcc', 'actcctgct'],没有重复。

答案 2 :(得分:1)

它必须是Python吗?

如果序列只是每行一个文本字符串,那么shell脚本将非常有效:

sort input-file-name | uniq > output-file-name

这将在32位Linux上完成高达2GB的文件。

如果您使用的是Windows,请安装GNU utils http://gnuwin32.sourceforge.net/summary.html

答案 3 :(得分:0)

不要害怕文件! ; - )

我假设以下内容发布了一个例子:

  1. 是一个文本文件
  2. 每行一个序列
  3. -

    filename = 'sequence.txt'
    with open(filename, 'r') as sqfile:
       sequences = sqfile.readlines() # now we have a list of strings
    
    #discarding the duplicates:
    uniques = list(set(sequences))
    

    就是这样 - 通过使用pythons set-type,我们可以自动消除所有重复项。

    如果你在同一行中有id和序列,如:

    423401 ttacguactg
    

    你可能想要消除像这样的ID:

    sequences = [s.strip().split()[-1] for s in sequences]
    

    with strip我们从前导空格和尾随空格中去掉字符串,并使用split我们将行/字符串分成2个组件:id和序列。 使用[-1]我们选择最后一个组件(=序列字符串)并将其重新打包到我们的序列列表中。

答案 4 :(得分:0)

我想到了四件事:

  1. 您可以使用set(),如F.X所述。 - 假设独特 字符串将全部适合内存
  2. 每个序列可以使用一个文件,并将文件提供给程序 像equivs3e: http://stromberg.dnsalias.org/~strombrg/equivalence-classes.html#python-3e
  3. 您可以使用gdbm作为一个集合,而不是通常的 键值存储使用。如果您需要100%的东西,这很好 准确,但你有太多的数据,以适应所有独特的 虚拟记忆。
  4. 你也许可以使用布隆过滤器将数据减少到更多 可管理的大小,如果你有真正大量的字符串 检查和许多重复。基本上布隆过滤器可以说 “这绝对不是在集合中”或“这几乎肯定在 设置“。通过这种方式,你可以消除大多数明显的 在使用更常见的手段操作之前重复 剩下的元素。 http://stromberg.dnsalias.org/~strombrg/drs-bloom-filter/