2016-06-14 90 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 –