gpt4 book ai didi

python - 对行进行分组、排序并删除冗余

转载 作者:行者123 更新时间:2023-12-01 05:16:30 25 4
gpt4 key购买 nike

我有一个包含 15 列的输入文件,

con13   tr|M0VCZ1|  91.39   267 23  0   131 211 1   267 1   480 239 267 33.4    99.6
con13 tr|M8B287| 97.12 590 17 0 344 211 1 267 0 104 239 590 74.0 99.8
con15 tr|M0WV77| 92.57 148 11 0 73 516 1 148 2 248 256 148 17.3 99.3
con15 tr|C5WNQ0| 85.14 148 22 0 73 516 1 178 4 233 256 148 17.3 99.3
con15 tr|B8AQC2| 83.78 148 24 0 73 516 1 148 6 233 256 148 17.3 99.3
con18 tr|G9HXG9| 99.66 293 1 0 144 102 1 293 7 527 139 301 63.1 97.0
con18 tr|M0XCZ0| 98.29 293 5 0 144 102 1 293 2 519 139 301 63.1 97.0

我需要 1) 在每个 con 内进行分组和迭代(使用 groupby),2) 将 line[2] 从最低值到最高值排序,3) 查看每个组内部是否有 line[0]、line[8] 和 line [9] 相似,4) 如果它们相似,则删除重复元素并将结果打印在新的 .txt 文件中,选择第 [2] 行中具有最高值的那个,以便我的输出文件如下所示,

con13   tr|M8B287|  97.12   590 17  0   344 211 1   267 0   104 239 590 74.0    99.8
con15 tr|M0WV77| 92.57 148 11 0 73 516 1 148 2 248 256 148 17.3 99.3
con15 tr|C5WNQ0| 85.14 148 22 0 73 516 1 178 4 233 256 148 17.3 99.3
con18 tr|G9HXG9| 99.66 293 1 0 144 102 1 293 7 527 139 301 63.1 97.0

我尝试的脚本仅打印一个 con 并且不排序,

from itertools import groupby
f1 = open('example.txt','r')
f2 = open('result1', 'w')
f3 = open('result2.txt','w')
for k, g in groupby(f1, key=lambda x:x.split()[0]):
seen = set()
for line in g:
hsp = tuple(line.rsplit())
if hsp[8] and hsp[9] not in seen:
seen.add(hsp)
f2.write(line.rstrip() + '\n')
else:
f3.write(line.rstrip() + '\n')

最佳答案

使用csv模块为您预先分割行并再次写出格式化数据,并在 seen 中使用元组 (仅第 9 列和第 10 列)跟踪相似的行:

import csv
from itertools import groupby
from operator import itemgetter

with open('example.txt','rb') as f1
with open('result1', 'wb') as f2, open('result2.txt','wb') as f3):
reader = csv.reader(f1, delimiter='\t')
writer1 = csv.writer(f2, delimiter='\t')
writer2 = csv.writer(f3, delimiter='\t')

for group, rows in groupby(reader, itemgetter(0)):
rows = sorted(rows, key=itemgetter(8, 9, 2))
for k, rows in groupby(rows, itemgetter(8, 9)):
# now we are grouping on columns 8 and 9,
# *and* these are sorted on column 2
# everything but the *last* row is written to writer2
rows = list(rows)
writer1.writerow(rows[-1])
writer2.writerows(rows[:-1])

sorted(rows, key=itemgetter(2))调用对第三列上的分组行(因此所有具有相同 row[0] 值的行)进行排序。

因为您只想将第 2 列中具有最高值的行(第 8 列和第 9 列相等的每组行)写入第一个结果文件,所以我们再次分组,但已排序在第 8、9 和 2 列上(按该顺序),然​​后仅对第 8 列和第 9 列进行分组,从而为第 2 列按升序排列排序组。然后将最后一行写入 result1 ,剩下的到result2.txt .

关于python - 对行进行分组、排序并删除冗余,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23089424/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com