Mein Ziel: Sortieren Sie eine list
von Produkten (dict
) zuerst nach Preis, dann nach Name. Mein Problem: Str
Werte mit Zahlen in ihnen sind nicht richtig sortiert (AKA "Human Sorting" oder "Natural Sorting").Python Sorting Str Preis mit zwei Dezimalstellen
fand ich diese Funktion aus einer ähnlichen Frage: Python sorting list of dictionaries by multiple keys
def multikeysort(items, columns):
from operator import itemgetter
comparers = [((itemgetter(col[1:].strip()), -1) if col.startswith('-') else
(itemgetter(col.strip()), 1)) for col in columns]
def comparer(left, right):
for fn, mult in comparers:
result = cmp(fn(left), fn(right))
if result:
return mult * result
else:
return 0
return sorted(items, cmp=comparer)
Das Problem ist, dass meine Preise str
Art, wie diese sind:
products = [
{'name': 'Product 200', 'price': '3000.00'},
{'name': 'Product 4', 'price': '100.10'},
{'name': 'Product 15', 'price': '20.00'},
{'name': 'Product 1', 'price': '5.05'},
{'name': 'Product 2', 'price': '4.99'},
]
So sind sie alphabetisch sortiert zu werden, wie folgt:
'100.10'
'20.10'
'3000.00'
'4.99'
'5.05'
Simi sonders, wenn ich nach Namen sortieren, bekomme ich diese:
'Product 1'
'Product 15'
'Product 2'
'Product 200'
'Product 4'
Die Namen in „Menschen“ Ordnung (1,2,15 statt 1,15,2) aufgeführt werden sollen. Ist es möglich, das zu beheben? Ich bin ziemlich neu bei Python, also vermisse ich vielleicht etwas Vitales. Vielen Dank.
EDIT
Mehr Info: Ich bin die Liste der Produkte in eine Django-Vorlage zu senden, die die Zahlen eingegeben werden müssen ordnungsgemäß formatiert werden. Wenn ich die Preise schwebe und sie dann entschwebe, muss ich zweimal durch die Liste der Produkte iterieren, was wie Overkill aussieht.
Müssen Ihre Preise Strings sein? Am besten wäre es, sie in Floats zu konvertieren – Tyler
'int' Typ entfernt die Nachkommastellen ('1.00' = '1'), und' float' löscht eine Dezimalzahl ('1.00' = '1.0') was nicht funktioniert t gut in den Warenkorb! – ThePloki