List nach Spalte Sortieren ohne Methode

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Nju
User
Beiträge: 5
Registriert: Dienstag 13. April 2021, 20:56

Hallo zusammen,
ich sitze gerade a einem kleinen Python Projekt und bräuchte da ein wenig Hilfe.
Ich habe eine CSV Datei die folgendermaßen aufgebaut ist:

Nr, Name, Gewicht,Höhe, Breite
112,Aerified, 41.70, 256.99, 141.01
656, Zoolab, 66.64, 108.44, 269.53
und das ganze mit ca. 10.000 zufällig generierten Datensätzen.

Diese Datei möchte ich nun nach einer gewählten Spalte Sortieren und ausgeben.
Hüerfür möchte ich keine Methoden benutzen sondern es mit einem Algorithmus lösen.
Dafür habe ich diese erstmal mit Pandas importiert und danach zu einer Liste convertiert (in der Hoffunung sie so besser erarbeiten zu können):

Code: Alles auswählen

frame = pd.concat(li, axis=0, ignore_index=True)
products_list = frame.values.tolist()
Das hat soweit auch funktionert.
Nun fehlt leider ein wenig der Ansatz.
Ich habe es schon mit einer Bubble Sortierung probiert:

Code: Alles auswählen

def sort(product_list):

  for passnum in range(len(product_list)-1, 0, -1):
     for i in range(passnum):
        if int(product_list[i][2]) > int(product_list[i+1][2]):
            temp = product_list[i]
            product_list[i] = product_list[i+1]
            product_list[i+1] = temp
  return product_list
print(sort(product_list))
Das Ich wollte in diesem Fall nach der 3. Spalte sortieren . Klappt aber leider nicht.
Habt ihr vielleicht noch andre Ideen?
Benutzeravatar
__blackjack__
User
Beiträge: 13103
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Meine Idee wäre die `sort()`-Methode.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Nju
User
Beiträge: 5
Registriert: Dienstag 13. April 2021, 20:56

Danke für die schnelle Antwort.
Mit der Sort Methode habe ich auch schon hinbekommen, allerdings suche ich noch wie gesagt nach einer Lösung ohne eine Methode zu verwenden. Also einen Algorithmus der das Problem "zu Fuß" löst.
Sirius3
User
Beiträge: 17749
Registriert: Sonntag 21. Oktober 2012, 17:20

Was bedeutet "funktioniert nicht"? Was ist Dein Ergebnis, und woran erkennst Du, dass es nicht funktioniert?
Eingerückt wird in Python immer mit 4 Leerzeichen pro Ebene, nicht mal zwei und dann drei.

Und wie bei der eingebauten sort-Methode, veränderst Du die Liste, solltest also keinen Rückgabewert haben.

Code: Alles auswählen

def sort_by_third_column(products):
    for j in range(len(products)-1, 0, -1):
        for i in range(j):
            if int(products[i][2]) > int(products[i+1][2]):
                products[i+1], products[i] = products[i], products[i+1]

sort_by_third_column(product_list)
print(product_list)
Nju
User
Beiträge: 5
Registriert: Dienstag 13. April 2021, 20:56

Vielen Dank für die Hilfe.
Bubble Sort hat nun geklappt.
Ich versuche jetzt auch noch das ganzen mit Quicksort zu lösen.
Ich bin schon soweit gekommen, dass ich nach der zweiten Spalte sortieren kann.

Code: Alles auswählen

def quickSort(list):
    if not list:
        return list
    pivot = list[0]
    lesser = quickSort([x for x in list[1:] if x[1] < pivot[1]])
    greater = quickSort([x for x in list[1:] if x[1] >= pivot[1]])
    return lesser + [pivot] + greater

print(quickSort(product_list))
Ich weiß jetzt nur nicht wie ich den Algorithmus anpasse um auch nach den anderen Spalten sortieren zu können.....
Wäre super wenn ihr noch ein paar Ideen hättet.
Nju
User
Beiträge: 5
Registriert: Dienstag 13. April 2021, 20:56

Habs schon heraus gefunden und kann nun auch nach den anderen Spalten Sortieren.
Nur bei der Sortierung nach der ersten Spalte (Index 0) erhalte ich einen Fehler:
RecursionError: maximum recursion depth exceeded in comparison
Hier der Code:

Code: Alles auswählen

def quickSort(list):
    if not list:
        return list
    pivot = list[0]
    lesser = quickSort([x for x in list[0:] if x[0] < pivot[0]])
    greater = quickSort([x for x in list[0:] if x[0] >= pivot[0]])
    return lesser + [pivot] + greater

print(quickSort(product_list))
Irgendwo scheint da ein Fehler zu sein, der allerdings nur bei Index 0 auftritt.
Nach allen anderen Indexen funktionert es.
Benutzeravatar
__blackjack__
User
Beiträge: 13103
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Nju: Wenn Du tatsächlich auch bei den anderen Spalten nach diesem Muster verändert hast, dann funktioniert tatsächlich *nur* die zweite Spalte. Also auch dritte, vierte und so weiter auch nicht.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Nju
User
Beiträge: 5
Registriert: Dienstag 13. April 2021, 20:56

Ja stimmt, es funktioniert leider wirklich nur mit der 2. Spalte richtig.
Wie müsste ich den Quellcode denn Anpassen um z.B. nach der dritten oder vierten Spalte zu sortieren?

Code: Alles auswählen

def quickSort(list):
    if not list:
        return list
    pivot = list[0]
    lesser = quickSort([x for x in list[1:] if x[1] < pivot[1]])
    greater = quickSort([x for x in list[1:] if x[1] >= pivot[1]])
    return lesser + [pivot] + greater

print(quickSort(product_list))
Antworten