python中的文件分组和排序

python中的文件分组和排序,python,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

我有这样的制表符分隔文件

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
我需要按基因名称分组,并将文件分为3个文件:1如果基因名称是唯一的2如果组内基因之间的长度差异大于10如果组内基因之间的长度差异小于p>如果目标是-

我需要所有长度差异超过10的基因都在一个文件中,即23.7-0.4>10,所以它应该在一个文件中

然后在is_中,您可以只检查最后一个元素和第一个元素之间的差异,因为您在调用此函数之前已经按第二个元素对它们进行排序,最后一个元素将是最大的,第一个元素将是最小的

因此,你可以这样做-

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

您的数据似乎已按排序顺序排列,因此您只需比较每组的第一个和最后一个浮动:

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)

你现在得到了什么?你有什么错误吗?基因UCW_Tt-k25_contig_29046产生在文件b中,我猜这是bcos我在做一个从上一个基因长度的减法,如何改进这个?如果有两个值的差值大于10,你需要它们在c文件中结束?没有,我需要所有长度差异超过10的基因都在一个文件中,即23.7-0.4>10,所以它应该在一个文件中。基本上,我需要在每个组中的所有长度之间进行减法运算。您给出的标准是否对应于文件的唯一分区并不明显。
def is_overlap(hits):
    if hits[-1][1] - hits[0][1] > 10:
        return True
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)