2016-06-14 65 views
0

我有一個看起來像刪除線

geneA geneB 134 
geneC geneF 395 
geneH geneD 958 
geneF geneC 395 
geneB geneA 134 
geneD geneH 958 

我想刪除具有相同的基因(即在相反的順序)行的文件,所以我只是得到

geneA geneB 134 
geneC geneF 395 
geneH geneD 958  

我有這個到目前爲止,但當我嘗試使用replace()或if語句時,我得到更多的重複。任何想法如何我可以改變這一點?

with open(filename, 'r') as handle, open(outfilename, 'a') as w: 

    for line in handle: 
     element = line.split() 
     gene1 = element[0] 
     gene2 = element[1] 

     for line in handle: 
      matchingelement = line.split() 
      gene3 = matchingelement[0] 
      gene4 = matchingelement[1] 

      if gene3 == gene2 and gene4 == gene1: 
       """Remove the line""" 
+0

「刪除此行」是指刪除它並再次寫入相同的文件或刪除它並將結果寫入新文件? –

+3

具有相同基因的線條最終總是具有相同的數字嗎? –

+0

我想寫任何留給新文件的東西。它們將始終具有相同的數字,但我試圖避免使用這種情況,以防萬一兩個基因之間的連接碰巧具有與另外兩個基因之間的連接相同的值。 –

回答

3

將這些基因轉換成一個可排列的形式,可以將它添加到一個集合中,並隨着您的行爲進行檢查。在這個例子中,我對基因進行了排序,以便順序無關緊要,然後將它們構建回單個「標準化」字符串。

filename = 'a.txt' 
outfilename = 'aout.txt' 

seen = set() 

with open(filename, 'r') as handle, open(outfilename, 'a') as w: 
    for line in handle: 
     element = line.split() 
     # a hashable "normalized" view of the genes 
     genes = '-'.join(sorted(element[0:2])) 
     if genes not in seen: 
      seen.add(genes) 
      w.write(line) 

print(open(outfilename).read()) 
+1

由於某種原因,我似乎無法弄清楚......'element'只有3個元素'['geneX','geneY','123']',對不對?爲什麼'element [0:3]'? –

+0

@VladislavMartin - 你是對的,應該是[0:2]。謝謝! – tdelaney

+0

即使那樣和'element'不一樣嗎?因爲'element'只有3項,所以'[0:2]'沒有什麼區別。我可能錯過了一些簡單的haha –