Seite 1 von 1

List nach Spalte Sortieren ohne Methode

Verfasst: Dienstag 13. April 2021, 21:15
von Nju
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?

Re: List nach Spalte Sortieren ohne Methode

Verfasst: Dienstag 13. April 2021, 22:37
von __blackjack__
Meine Idee wäre die `sort()`-Methode.

Re: List nach Spalte Sortieren ohne Methode

Verfasst: Dienstag 13. April 2021, 22:59
von Nju
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.

Re: List nach Spalte Sortieren ohne Methode

Verfasst: Mittwoch 14. April 2021, 07:24
von Sirius3
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)

Re: List nach Spalte Sortieren ohne Methode

Verfasst: Mittwoch 14. April 2021, 14:12
von Nju
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.

Re: List nach Spalte Sortieren ohne Methode

Verfasst: Mittwoch 14. April 2021, 14:59
von Nju
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.

Re: List nach Spalte Sortieren ohne Methode

Verfasst: Mittwoch 14. April 2021, 15:41
von __blackjack__
@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.

Re: List nach Spalte Sortieren ohne Methode

Verfasst: Dienstag 20. April 2021, 15:22
von Nju
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))