2016-05-17 15 views
1

Ich versuche, eine Rangliste zu machen. Hier ist eine Liste, ich habe:Sortieren von Strings begleitet von Ganzzahlen in der Liste

list=['rami4\n', 'kev13\n', 'demian6\n'] 

Ich möchte in der Lage sein, diese Liste zu sortieren von der höchsten Anzahl an kleinsten oder sogar kleinste höchsten, was so etwas wie:

list=['kev13\n', 'demian6\n', 'rami4\n'] 

Ich habe versucht, Dinge wie re.findall('\d+', list[loop])[0] zu benutzen, aber ich schaffte es nur, aus der Liste den besten Spieler zu bekommen. Möchten Sie den Code nicht für so viele Spieler wiederholen, wie er existiert? Hat jemand eine Idee?

Antwort

3

Sie müssen in der Tat das re Modul verwenden, aber auch den key Parameter der sort() Methode.

reg = re.compile('\w*?(\d+)\\n') 
lst.sort(key=lambda s: int(reg.match(s).group(1))) 

Es funktioniert gut mit findall(), wie Sie zu haben:

reg = re.compile('\d+') 
lst.sort(key=lambda s: int(reg.findall(s)[0])) 

Bitte beachte, dass ich den regulären Ausdruck compile() so dass es ein für alle Mal, anstatt für jedes Element in der Liste berechnet wird.

+0

Dank Delgan, das hat funktioniert. Könnten Sie jedoch etwas mehr über die von Ihnen verwendete Kompilierung() erklären? –

+0

@ArwanCredoz Einige Informationen, [hier] (https://msdn.microsoft.com/library/8zbs0h2f%28v=vs.110%29.aspx). Kurz gesagt, ein Regex ist eine Zeichenfolge, die zuerst in eine Folge von Anweisungen konvertiert wird, die dann auf Ihre Zeichenfolge angewendet werden, damit sie übereinstimmt. Die Kompilierung speichert den ersten Schritt und erhöht die Geschwindigkeit, wenn Sie die gleiche Regex mit mehreren Strings übereinstimmen müssen. In Wirklichkeit spielt das keine Rolle, da Python die berechnete Regex intern zwischenspeichert. Aber ich denke, es ist die beste Vorgehensweise, dies explizit zu tun. – Delgan

1

Ich habe eine andere Lösung, die auf objektorientierter Programmierung und dem Überschreiben der __lt__ speziellen Methoden von str basiert.

import re 

class SpecialString(str): 
    def __lt__(self, other): 
     pattern=re.compile(r"\d+") 
     return int(pattern.search(str(self)).group(0)) < int(pattern.search(str(other)).group(0)) 

if __name__ == "__main__": 
    listing = ['rami4\n', 'kev13\n', 'demian6\n'] 
    spe_list = [SpecialString(x) for x in listing] 
    spe_list.sort() 
    print(spe_list) 

, die auf die Standardausgabe:

['rami4\n', 'demian6\n', 'kev13\n'] 

Mit dieser Methode können Sie die sort Funktion neu zu schreiben und die eingebaute in einem verwenden (was wahrscheinlich optimiert wird). Da Ihre Strings als "Spezialisierung der str Klasse" betrachtet werden können, ist der Vererbungsmechanismus sehr geeignet, da Sie alle seine Eigenschaften behalten, aber seinen Vergleichsmechanismus neu schreiben.

Verwandte Themen