【问题标题】:How to sort by two lines and print the line with the highest value如何按两行排序并打印具有最高值的行
【发布时间】:2015-06-08 09:29:42
【问题描述】:

我有一个输入文件,

1A  Traes_1AS_6052071D9.1   99.01   101 99.0    
1A  Traes_1DS_6BA87D1DA.1   96.04   101 99.0    
1A  Traes_1BS_480915AD0.1   94.06   101 99.0    
1B  Traes_1AS_49D585BA6.2   99.01   101 72.0    
1B  Traes_1BS_47F027BBE.2   98.02   101 89.0    
1B  Traes_1DS_3F816B920.1   97.03   101 92.0    
1C  Traes_1AS_3451447E0.1   99.01   101 97.0
1C  Traes_1BS_9F243CEA6.2   92.93   99  97.0    
1C  Traes_1DS_2A6443F45.1   89.90   99  97.0    

我需要

  1. 在每个 line[0] 内部进行分组和迭代,
  2. line[4]从低到高排序,取最高值
  3. 如果它们相似,则选择line[2] 中具有最高值的结果打印,这样我的输出文件如下所示:

需要的输出:

1A  Traes_1AS_6052071D9.1   99.01   101 99.0    
1B  Traes_1DS_3F816B920.1   97.03   101 92.0    
1C  Traes_1AS_3451447E0.1   99.01   101 97.0    

这是我的尝试,但只需要按照最高line[4]

import csv
from itertools import groupby
from operator import itemgetter
with open('my_file','rb') as f1:
with open('out_file', 'wb') as f2:
    reader = csv.reader(f1, delimiter='\t')
    writer1 = csv.writer(f2, delimiter='\t')
    for group, rows in groupby(reader, itemgetter(0)):
        seen = set()
        rows = sorted(rows, key=lambda r: float(r[4]))
        for row in rows:
            max(rows, key=lambda r: float(r[4]))
            writer1.writerow(row)

【问题讨论】:

    标签: python sorting


    【解决方案1】:

    只需让maxkey 函数返回(r[4], r[2]) 的元组

    稍微简化的例子(没有输出文件)

    with open('data.txt','rb') as f1:
        reader = csv.reader(f1, delimiter='\t')
        for group, rows in groupby(reader, itemgetter(0)):
            best = max(rows, key=lambda r: (float(r[4]), float(r[2])))
            print best
    

    【讨论】:

      猜你喜欢
      • 2020-03-19
      • 2018-07-09
      • 1970-01-01
      • 2018-08-07
      • 2018-07-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-06-03
      相关资源
      最近更新 更多