2017-02-03 5 views
0

Если мой разделителях табуляции файла:Получить элемент с наибольшим значением в питоне

a b 77.8 
a d 77.8 
e f 56.7 
e r 40.0 

Я хочу напечатать эль в строке [0] с максимальным значением в строке [2], но когда значение такое же, чтобы печатать оба, как изменить мой код ниже для этого?

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

Итак, мой вывод должен быть таким:

a b 77.8 
a d 77.8 
e f 56.7 
+0

Каким должен быть правильный вывод? –

ответ

1

Вместо того, чтобы писать максимальный элемент из rows можно сортировать строки в порядке убывания третьего значения, группа его третьим значением и писать элементы в первой группе:

import csv 
from itertools import groupby 
from operator import itemgetter 

with open('input.txt','rb') as f_in, open('out.txt','wb') as f_out: 
    reader = csv.reader(f_in, delimiter='\t') 
    writer1 = csv.writer(f_out, delimiter='\t') 
    for group, rows in groupby(filter(lambda x: x[0]!=x[1], reader), key=itemgetter(0)): 
     rows = sorted(rows, key=lambda r: (float(r[2])), reverse=True) 
     _, best = next(groupby(rows, key=itemgetter(2))) 
     writer1.writerows(best) 

Выход в out.txt:

a b 77.8 
a d 77.8 
e f 56.7 
1

Альтернативой, которая использует pandas, (где чтение и запись файлов лучше):

import pandas as pd 

df = pd.read_table('eg.txt', header=None, sep=' ') 

with open('output.txt', 'wb') as f: 
    for c in set(df[0]): 
     d = df[df[0] == c].sort_values(by=[2], ascending=False) 
     d = d[d[2] == d[2].iloc[0]] 
     d.to_csv(f, index=False, sep='\t', header=False) 

, который дает выход:

a b 77.8 
a d 77.8 
e f 56.7