2016-06-19 4 views
0

zu erstellen Also mache ich eine Game-Server-Sache, die Benutzer anmelden und wählen Sie ein Spiel zu spielen und fügt dann, was auch immer sie zu einer Notepad-Datei im Format: zB Blackjack) Benutzername, # Chips, "Chips". Jetzt möchte ich alle Partituren in der Datei sortieren, um sie auf meiner GUI anzuzeigen, aber ich darf keine eingebauten Funktionen wie sortiert verwenden, sondern muss stattdessen einen Algorithmus entwickeln. Ich habe eine Blasensortierung und Insertion ohne Glück versucht. Hier ist, was ich bisher:Versucht, 2d-Array in Python zu sortieren, um eine Liste von Highscores

blackjackList = [['harsh', '4', 'chips'], ['ahmed', '25', 'chips'], ['yousef', '1003', 'chips'], ['krushangi', '200', 'chips'], ['bombberman', '1202', 'chips']] 
def bubbleSort(alist): 
    for passnum in range(len(alist)-1,0,-1): 
     for i in range(passnum): 
      if alist[i][1]>alist[i+1][1]: 
       temp = alist[i] 
       alist[i] = alist[i+1] 
       alist[i+1] = temp 
     return alist 

Diese derzeit gibt

[['ahmed', '25', 'chips'], ['yousef', '1003', 'chips'], ['krushangi', '200', 'chips'], ['bombberman', '1202', 'chips'], ['harsh', '4', 'chips']] 

, wenn ich es mit blackjacklist verwenden, aber ich will es blackjacklist machen, um zu gehen von aufsteigend in absteigend Partituren.

+0

also ändern Sie '>' in '<', um die Sortierreihenfolge umzukehren? Was ist die gewünschte Ausgabe? –

+0

Ich möchte, dass die Liste so sortiert wird, dass die Person mit der höchsten Punktzahl zuerst und die niedrigste Punktzahl zuletzt ist –

Antwort

3

Ihr Problem ist, dass die return-Anweisung zu viel eingerückt ist und innerhalb der for-Schleife sitzt, daher wird nur ein Durchlauf durchgeführt, bevor sie zurückgegeben wird.

Auch Sie vergleichen die Zahlen als Zeichenfolgen. Dies ergibt nicht die erwartete Reihenfolge (z. B. ist "10" kleiner als "2"). Sie sollten int() verwenden, um sie in ganze Zahlen zu konvertieren, die dann korrekt sortiert werden.

+0

ok, also habe ich das geändert und es funktioniert gut für meine Blackjacklisten-Highscores, aber jetzt, wenn ich versuche, es mit meiner anderen Liste zu tun, tut es nicht arbeite nicht –

+0

Wie ist deine andere Liste? Ich habe die Antwort erweitert, um ein anderes Problem zu behandeln, bei dem es sich möglicherweise um Ihr Problem handelt. – neil

+0

warten Ich habe es noch einmal überprüft und es hat nicht funktioniert für Blackjacklist hier ist, was es jetzt ausgegeben: [['yousef', '1003', 'chips'], ['bombberman', '1202', 'chips'], [ "krushangi", "200", "chips", "ahmed", "25", "chips", "harsh", "4", "chips"]] –

0

Sie können Quicksort zum Sortieren der Arrays verwenden.

>>> blackjackList = [['harsh', '4', 'chips'], ['ahmed', '25', 'chips'], ['yousef', '1003', 'chips'], ['krushangi', '200', 'chips'], ['bombberman', '1202', 'chips']] 
>>> def quicksort(arr): 
...  if len(arr)==0: return [] 
...  if len(arr)==1: return arr 
...  left = [i for i in arr[1:] if int(i[1])<int(arr[0][1])] # for descending, exchange 
...  right = [i for i in arr[1:] if int(i[1])>=int(arr[0][1])] # these two values 
...  return quicksort(left)+[arr[0]]+quicksort(right) 
... 
>>> quicksort(blackjackList) 
[['harsh', '4', 'chips'], ['ahmed', '25', 'chips'], ['krushangi', '200', 'chips'], ['yousef', '1003', 'chips'], ['bombberman', '1202', 'chips']] 

Der obige Code gibt die aufsteigende sortierte Liste an. Um die sortierte Liste absteigend zu erhalten, tauschen Sie einfach die Werte für left und right im Code aus.

+0

Oh, das ist sauber, ich habe das nicht zuvor verwendet. Ich werde es versuchen, danke! –