2017-10-17 2 views
0
import csv 

names = [] 
scores = [] 

length = 0 

with open('table.csv') as csvfile: 
    read = csv.reader(csvfile, delimiter = ',') 
    for row in read: 
     name = row[0] 
     score = row[1] 
     length = length + 1 
     names.append(name) 
     scores.append(score) 


print(names) 
print(scores) #printing unsorted list 

#using bubble sort 
done = 0 

while done != 1: 
    done = 1 
    for i in range(length - 1): 
     if scores[i] > scores[i +1]: 
     scores[i],scores[i+1] = scores[i + 1], scores[i] 
     names[i],names[i+1] = names[i + 1], names[i] 
     done = 0 
print("") 

print(names) 
print(scores) 

Click here to access image that shows the output of the codeBlase Art nicht Ausgabe erzeugen wird

Dieser Code gewünschten bedeutet für ein Spiel aus der Highscore-Tabelle zu drucken, die ich entwickle. Ich weiß, dass die Verwendung von Bubble Sort sehr ineffizient ist, aber ich probiere es gerade erst aus. Also im Grunde ist das Problem mit dem Code, dass es sie bestellt, aber wenn die Zahl größer als 100.000 ist, scheint es über die letzte Null zu überspringen und es in Ordnung zu setzen, als ob es 10000 Ich denke, etwas kann entweder falsch sein mit der Anzahl der Schleifen oder vielleicht über 100000 würde in der Regel als 100.000 messing mit der CSV-Datei geschrieben werden, weiß ich ehrlich gesagt nicht.

+1

für alle 2 Werte, die in der richtigen Reihenfolge am Ende der for-Schleife sind, wird Ihr Code beendet (weil getan wird gleich 1) –

+0

Ihre Reihenfolge Strings so ist es alphabetisch, die Ergebnisse scheinen kohärent. – Axnyff

Antwort

1

Das Problem ist, dass beim Lesen der CSV-Datei, Sie Strings bekommen. Dann macht die Blasensortierung eine lexikografische Sortierung und nicht die numerische Sortierung, nach der Sie suchen.

es zu beheben typisieren die Partitur in int (vorausgesetzt, die Werte ganze Zahlen sind) als

score = int(row[1]) 

folgt und dann sollte es funktionieren.

1

In if Anweisung vergleicht man strings, nicht int. Versuchen

if scores[i] > scores[i +1]:

mit

if int(scores[i]) > int(scores[i +1]):

0

Die Zahlen zu ersetzen, werden als Strings gespeichert, die Ihre Art verursacht alle zu sehen, die 1 ist als erste anstatt ihre ganzzahligen Wert

0

Ich denke es liegt daran, dass sie mit String-Werten und nicht mit Zahlen (zB Ints) behandelt werden. Daher wird der Vergleich mit dem ersten Zeichen durchgeführt, das im Fall von 100.000 "1" ist. Zum Beispiel, durch diese Logik 55.000 ist größer als 100.000 als 5 ist größer als 1.

Hoffe das hilft, lassen Sie mich wissen, wie es geht!

+0

Gehen viel besser, produzieren die richtige Ausgabe jetzt, danke !! –

+0

Schön, gute Arbeit! –

Verwandte Themen