Моя цель: Сортировка list
товаров (dict
) сначала по цене, а затем по названию. Моя проблема: Str
значения с номерами в них не отсортированы должным образом (AKA «сортировка человека» или «естественная сортировка»).Python сортировка str цена с двумя десятичными знаками
Я нашел эту функцию с подобным вопросом: 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)
Проблема в том, что мои Цены str
типа, например:
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'},
]
Так они получают отсортированы по алфавиту, например:
'100.10'
'20.10'
'3000.00'
'4.99'
'5.05'
Simi бенно, когда я сортировать по имени, я получаю это:
'Product 1'
'Product 15'
'Product 2'
'Product 200'
'Product 4'
Имена должны быть перечислены в «человеческом» порядке (1,2,15 вместо 1,15,2). Можно ли это исправить? Я довольно новичок в python, так что, возможно, мне не хватает чего-то жизненно важного. Благодарю.
EDIT
Дополнительная информация: Я посылаю список продуктов шаблона Джанго, который требует номера, чтобы быть правильно отформатирована. Если я буду плавать по ценам, а затем их не плавать, я должен дважды перебирать список продуктов, что кажется излишним.
Ваши цены должны быть строками? Лучше всего было бы отбросить их на floats – Tyler
'int' type удаляет десятичные разряды ('1.00' = '1'), а' float' удаляет одно десятичное число ('1.00' = '1.0'), т хорошо выглядеть в корзине! – ThePloki