2012-07-12 71 views
3

我用Biopython來分析基因突變的分子生物學家,我的問題是這樣的:Python的編輯距離

我有包含許多不同的序列(百萬)的文件,其中大部分是重複的。我需要找到重複並丟棄它們,保留每個獨特序列的一個副本。我正在計劃使用模塊editdist來計算它們之間的編輯距離,以確定哪些是重複的,但editdist只能使用2個字符串,而不是文件。

任何人都知道我可以如何使用該模塊與文件而不是字符串?

+1

在文件中讀取並將其拆分爲單詞,然後比較單詞? – 2012-07-12 20:15:41

+1

你能發佈一些關於該文件包含的更多信息嗎?每一行都是一個序列?是否有諸如'BEGIN SEQUENCE'或'END SEQUENCE?'之類的標記? ? – 2012-07-12 20:17:32

+3

您是否確實對近似重複(對於哪些editdist可能有用)或實際重複感興趣? – 2012-07-12 20:20:48

回答

1

如果要過濾掉重複的確切數據,可以使用set Python內置類型。作爲一個例子:

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

s則等於['tccggatcc', 'actcctgct'],沒有重複。

+0

這就是如果有數百萬條記錄會變得非常大...... – 2012-07-12 20:27:10

+0

也許,是的。這是一個簡單,不費腦的解決方案,但它可以工作。你有其他想法嗎? – 2012-07-12 20:29:08

+0

如果「其中大部分」都是重複的,那麼在解析類似'for lot_of_sequences:dict.setdefault(sequence)'中的序列的文件時,可能將它們用作字典鍵將消耗更少的內存。 – xbello 2014-08-04 19:10:47

0

不要怕文件!

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)) 

- 一個文本文件中每行

  1. 一個序列

:;-)

我假設下面張貼的例子就是這樣 - 通過使用pythons set-type,我們可以自動消除所有重複項。

如果你有ID,並在同一行像序列:你可能想消除像IDS

423401 ttacguactg 

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

與帶我們從領導剝離字符串拖尾的空格和分割我們將行/字符串分爲兩個部分:id和序列。 與[-1]我們選擇最後一個組件(=序列字符串)並重新打包到我們的序列表中。

2

假設你的文件只包括序列排列,每行一個序列,我建議如下:

seq_file = open(#your file) 

sequences = [seq for seq in seq_file] 

uniques = list(set(sequences)) 

假設你有這方面的記憶。幾百萬?

ETA:

正在讀上面的評論(但沒有評論PRIVS) - 假設序列ID是任何重複相同的,這會工作。如果重複的序列可以有不同的序列ID,那麼會知道哪個先出現,以及它們之間存在什麼。

0

四件事情浮現在腦海中:

  1. 您可以使用一組(),由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/
1

它必須是Python嗎?

如果序列是簡單的文本字符串,每行一個接着一個shell腳本將是非常有效的:

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

這將做文件工作高達2GB的32位Linux。

如果您在Windows上,則安裝GNU utils http://gnuwin32.sourceforge.net/summary.html