2017-01-24 5 views
1

例入力ファイル、最高のユニークなヒット

name1 name1 100 
name1 name2 99.4 
name1 name3 67.8 
name1 name4 40.2 
name2 name2 100 
name2 name1 98 

私は1たい)グループ)は、名前のカラム1と2を比較し、それが同じであれば、3を無視する)とのラインを印刷最高値。だから私の出力は、私が代わりに最大の並べ替えを使用する場合、私の最高のヒットが消え、

name1 name2 99.4 
name2 name1 98 

私の試みです。

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

あなたの現在のコードが期待した結果をもたらさない理由をもう少し説明してください。期待される成果は? – Guillaume

+0

私の出力が上です、それは私にエラーまたはmax()arg空のseq-sを与える、私はこれを行うために2つの別々のスクリプトを書くことができます..しかし、私はこのための1つのスクリプトをしたいです。 – user3224522

答えて

3

私は、最後によると、最初の列maxでグループ、filter不要な行をしたい:

with open('input.txt','rb') as f1: 
    with open('output.txt', 'wb') as f2: 
     reader = csv.reader(f1, delimiter='\t') 
     writer1 = csv.writer(f2, delimiter='\t') 
     out_rows = [ 
      max(g, key=lambda x: float(x[2]) for k, g in groupby(
       filter(lambda x: x[0]!=x[1], reader), key=itemgetter(0) 
      ) 
     ]  
     writer1.writerows(out_rows) 
+0

それは言います:TypeError:filterキーワード引数はありません – user3224522

+0

@ user3224522もちろん、もちろんです。フィルタのシグネチャは、maxとgroupbyと比較してもう一方の方法です。更新しました。 – schwobaseggl

1

groupby()によって返さあなたのrowsイテレータは内の他、一度for line in rows:で、二回繰り返されますmax(rows)。イテレータは最終的に使い果たされ、エラーが発生します。

最初にrowsイテレータからリストを作成すると、それを複数回反復することができます。

関連する問題