2015-07-20 74 views
-1

我有这样制表符分隔的文件,分组和排序的文件在python

gene_name    length 
Traes_3AS_4F141FD24.2 24.8  
Traes_4AL_A00EF17B2.1 0.0 
Traes_4AL_A00EF17B2.1 0.9 
Traes_4BS_6943FED4B.1 4.5 
Traes_4BS_6943FED4B.1 42.9  
UCW_Tt-k25_contig_29046 0.4 
UCW_Tt-k25_contig_29046 2.8 
UCW_Tt-k25_contig_29046 11.4  
UCW_Tt-k25_contig_29046 12.3  
UCW_Tt-k25_contig_29046 14.4 
UCW_Tt-k25_contig_29046 14.2  
UCW_Tt-k25_contig_29046 19.6  
UCW_Tt-k25_contig_29046 19.6 
UCW_Tt-k25_contig_29046 21.1  
UCW_Tt-k25_contig_29046 23.7  
UCW_Tt-k25_contig_29046 23.7 

我需要组由gene_name,并且在3个文件分文件:1)如果gene_name是独特2)如果所述差异在组内的基因之间的长度是> 10 3)如果组内的长度中的差异是< 10. 这是我的尝试,

from itertools import groupby 

def iter_hits(hits): 
    for i in range(1,len(hits)): 
     (p, c) = hits[i-1], hits[i] 
     yield p, c 

def is_overlap(hits): 
    for p, c in iter_hits(hits): 
     if c[1] - p[1] > 10: 
      return True 

fh = open('my_file','r') 
oh1 = open('a', 'w') 
oh2 = open('b', 'w') 
oh3 = open('c', 'w') 

for qid, grp in groupby(fh, lambda l: l.split()[0]): 
    hits = [] 
    for line in grp: 
     hsp = line.split() 
     hsp[1]= float(hsp[1]) 
     hits.append(hsp) 
    hits.sort(key=lambda x: x[1]) 
    if len(hits)==1: 
     oh = oh3 
    elif is_overlap(hits): 
     oh = oh1 
    else: 
     oh = oh2 

    for hit in hits: 
     oh.write('\t'.join([str(f) for f in hit])+'\n') 

我需要的输出是:

c)Traes_3AS_4F141FD24.2 24.8   b)Traes_4AL_A00EF17B2.1 0.0 
              Traes_4AL_A00EF17B2.1 0.9 
a)Traes_4BS_6943FED4B.1 4.5 
Traes_4BS_6943FED4B.1 42.9  
UCW_Tt-k25_contig_29046 0.4 
UCW_Tt-k25_contig_29046 2.8 
UCW_Tt-k25_contig_29046 11.4  
UCW_Tt-k25_contig_29046 12.3  
UCW_Tt-k25_contig_29046 14.4 
UCW_Tt-k25_contig_29046 14.2  
UCW_Tt-k25_contig_29046 19.6  
UCW_Tt-k25_contig_29046 19.6 
UCW_Tt-k25_contig_29046 21.1  
UCW_Tt-k25_contig_29046 23.7  
UCW_Tt-k25_contig_29046 23.7 

P.S.我很抱歉有这么长的一个问题,但否则我很难解释清楚。

+0

你想说什么马上?你有什么错误吗? –

+0

基因UCW_Tt-k25_contig_29046导致文件b,我想这是bcos我正在做一个从previou基因长度的减法,如何改进? – user3224522

+0

如果有两个值大于10的值,你需要它们在'c'文件中结束吗? –

回答

1

如果你的目标是 -

我需要的所有基因的长度,其中有一个文件超过10个不同是,即23.7-0.4> 10所以应该在一个文件中。

然后在is_overlap(hits)你可以检查的最后一个元素和第一个元素之间的不同,因为你是第二个元素调用此函数之前已经对它们进行排序,最后一个元素将是最大的,而第一元素将是最小的。

因此,你可以做 -

def is_overlap(hits): 
    if hits[-1][1] - hits[0][1] > 10: 
     return True 
1

你的数据似乎已经在有序其中,所以你刚刚从各组比较第一个和最后彩车:

from itertools import groupby 

with open('a', 'w') as uniq, open('b', 'w') as lt, open('c', 'w') as gt: 
    with open("foo.txt") as f: 
     next(f) 
     for _, v in groupby(f, lambda x: x.split(None, 1)[0]): 
      v = list(v) 
      if len(v) == 1: 
       uniq.write(v[0]) 
      elif float(v[-1].split(None, 1)[1]) - float(v[0].split(None, 1)[1]) < 10: 
       lt.writelines(v) 
      elif float(v[-1].split(None, 1)[1]) - float(v[0].split(None, 1)[1]) > 10: 
       gt.writelines(v)