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)