gpt4 book ai didi

python - 如何打印具有最高值的 3 行

转载 作者:太空宇宙 更新时间:2023-11-03 12:58:11 25 4
gpt4 key购买 nike

我有一个输入文件,

10N06_64  sc635516  93.93   100.0
10N06_64 sc711028 93.99 100.0
10N06_64 sc255425 93.46 95.8
10N06_64 sc115511 87.5 93.0
116F19_238 sc121016 91.30 12.1
116F19_238 sc1132492 90.94 6.1
116F19_238 sc513573 87.38 6.1
116F19_238 sc68511 75.93 10.5

我需要在每一行 [0] 内进行分组和迭代,并打印 3 行,选择在行 [3] 和行 [2] 中具有最高值的行,以便我的输出文件如下所示:

10N06_64  sc635516  93.93   100.0
10N06_64 sc711028 93.99 100.0
10N06_64 sc255425 93.46 95.8
116F19_238 sc121016 91.30 12.1
116F19_238 sc68511 75.93 10.5
116F19_238 sc1132492 90.94 6.1

这是我的尝试,但它只打印了一个最佳行,如何修改它以打印 3 个最佳匹配?

import csv
from itertools import groupby
from operator import itemgetter
with open('myfile','rb') as f1:
with open('outfile', 'wb') as f2:
reader = csv.reader(f1, delimiter='\t')
writer1 = csv.writer(f2, delimiter='\t')
for group, rows in groupby(reader, itemgetter(0)):
best = max(rows, key=lambda r: (float(r[3]), float(r[2])))
writer1.writerow(best)

最佳答案

你可以使用 heapq.nlargest()获取具有最高值的行:

#!/usr/bin/env python
import csv
import sys
from heapq import nlargest
from itertools import groupby

writerows = csv.writer(sys.stdout, delimiter='\t').writerows
for _, rows in groupby(csv.reader(sys.stdin, delimiter='\t'), key=lambda r: r[0]):
writerows(nlargest(3, rows, key=lambda row: (float(row[3]), float(row[2]))))

例子:

$ <input.csv ./your-script >output.csv

输出

10N06_64    sc711028    93.99   100.0
10N06_64 sc635516 93.93 100.0
10N06_64 sc255425 93.46 95.8
116F19_238 sc121016 91.30 12.1
116F19_238 sc68511 75.93 10.5
116F19_238 sc1132492 90.94 6.1

nlargest() 允许避免将输入组加载到内存中。如果行数总是很小,那么您还可以使用 sorted(iterable, key=key, reverse=True)[:n]

关于python - 如何打印具有最高值的 3 行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32741114/

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