2016-05-10 18 views
1

Ich habe derzeit einige Daten in einer Datei gespeichert, die den Namen einer Person und die Punktzahl enthält, die sie beim Spielen erhalten haben.Python Eine Datei mit Namen und Punkten sortieren

Die Daten in der Datei sieht wie folgt aus:

Reece 0 
John 5 
Alex 2 

ich so etwas wie dies versucht haben, mit:

with open("Scores.txt","r") as f: 
    lines = sorted(f.readlines()) 
    print lines 

Aber das sortiert sie nur durch den ersten Buchstaben in jedem ihrer Namen.

Mein Ausgang so sein müsse:

Reece 0 
Alex 2 
John 5 

Es ist ein relativ einfaches Programm, und ich bin mit Python 2.7

Jede mögliche Hilfe würde erstaunlich sein kann ich auch alle Infos über mein Programm bieten !

+2

so müssen Sie Ihre Linien nach Nummer sortieren (0, 2, 5)? –

Antwort

0

cmp param Hinzufügen von sorted zu nennen:

with open("test.txt","r") as f: 
    comparator = (lambda x,y: cmp(int(x.split(' ')[-1]), int(y.split(' ')[-1]))) 
    lines = sorted(f.readlines(), cmp=comparator) 
    print lines 
+0

Das hat jetzt nichts sortiert – Reece

+0

@Reece aktualisierte Antwort, viel Glück)! –

2

Ein Schlüssel wie so funktionieren würde:

with open("test.txt","r") as f: 
    lines = sorted(iter(f), key=lambda x: int(x.partition(" ")[-1])) 
    print lines 

Es wird eine effiziente Speicher, wie Sie nur 1 Liste erstellen, und wie Sie Wenn ich nur einmal auf den Zeilen der Datei iteriere, wird es ziemlich schnell sein.

Insgesamt glaube ich, dass es die schnellste und effizienteste Methode ist.

Die volle Funktionalität einschließlich Ausgang wäre daher sein:

with open("test.txt","r+") as f: 
    lines = sorted(iter(f), key=lambda x: int(x.partition(" ")[-1])) 
    f.seek(0) 
    f.truncate() 
    [f.write(l if l.endswith("\n") else l + "\n") for l in lines] 
+0

Nur um zu verdeutlichen, was dieser Code macht, gehe durch jede Zeile in der Datei (** iter (f) **) und erzähle der _sorted() _ Funktion, um basierend auf der Lambda (anonymen) Funktion zu sortieren (** lambda x: int (x.partition ("") [- 1]) **), die die Punktzahl von jeder Zeile erhält, indem sie sie vom Namen in der Zeile trennt (** x.partition ("") [- 1] * *). Dies wird die Liste der Zeilen in der Datei nach Ergebnis sortiert in die Variable _lines_ speichern, die dann am Ende gedruckt wird. – Mark

+0

Ich glaube nicht, dass Sie ** iter (f) ** in der Funktion _sorted() _ benötigen, sondern Sie können einfach ** f ** verwenden, da die Funktion _sorted() _ ein iterables als erstes Argument akzeptiert eine Datei (f) ist. – Mark

+1

@Mark Sie haben Recht, ich habe 'iter() 'nur zur Verdeutlichung verwendet, es verursacht überhaupt keinen Overhead, und es ist wirklich von Vorliebe. – Bharel