2017-01-24 3 views
1

Beispiel Eingabedatei,Die beste einzigartige Hit

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

Ich würde von der 1. Säule gerne 1) Gruppe 2) vergleichen Namen column1 und 2 und wenn es die gleichen, ignorieren 3) ist mit der der Linie gedruckt Höchster Wert. Also meine Ausgabe ist,

name1 name2 99.4 
name2 name1 98 

Mein Versuch, wenn ich Sortierung anstelle von Max meine besten Treffer verschwindet.

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

Bitte erläutern Sie ein wenig mehr, warum Ihr aktueller Code nicht das Ergebnis liefert, das Sie erwarten. Was ist Ihre erwartete Leistung? – Guillaume

+0

meine Ausgabe ist oben, es gibt mir einen Fehler oder max() arg leer seq-s, könnte ich zwei separate Skripte dazu schreiben..aber ich möchte 1 Skript für diese .. – user3224522

Antwort

3

Ich würde filter die unnötigen Linien, dann die Gruppe von ersten Spalte und max durch die letzte:

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

es heißt: TypeError: filter() Nimmt keine Schlüsselwort Argumente – user3224522

+0

@ user3224522 Ja, natürlich. Die Signatur des Filters ist im Vergleich zu max und groupby umgekehrt. Aktualisiert. – schwobaseggl

1

Ihre rows Iterator zurück von groupby() wird zweimal wiederholt, einmal in for line in rows:, die andere in max(rows). Der Iterator wird schließlich aufgebraucht, was zu dem Fehler führt, den Sie haben.

Erstellen Sie zuerst eine Liste von Ihrem rows Iterator, Sie können dann mehrmals darüber iterieren.