2014-02-06 3 views
1

Я создал словарь на python, чтобы обработать изменение для покупки.Как правильно отсортировать элементы в словаре Python?

money = { '$100.00' : 0, '$50.00' : 0, '$20.00' : 0,'$10.00' : 0, 
       '$5.00' : 0, '$1.00' : 0,'$0.25' : 0, '$0.10' : 0, '$0.05' : 0, 
       '$0.01' : 0} 

Однако, когда я хочу, чтобы напечатать это, я не могу показаться, чтобы быть в состоянии сделать это из «наименьшего к наибольшему» часть валюты.

Это то, что я сделал в попытке отсортировать его:

keyList = list(money.keys()) 
keyList.sort() 
for key in keyList: 
    print(key, money[key]) 

Однако результат дал идет от ... $ 1 -> $ 10 -> $ 100 -> $ 20 ... Любые предложения, так это будет $ 1 -> $ 5 -> $ 10 ...?

ответ

3

Сортировка происходит лексически, т.е. в алфавитном порядке, по одному символу за один раз. Измените функцию сортировки, чтобы удалить знак доллара и конвертировать плавать:

keyList.sort(key=lambda x:float(x[1:])) 

Или еще лучше, удалить "$" из ключа, оставив ключ поплавок, и только добавить "$" при печати

+0

Хорошая точка с $. Я попробую, спасибо. – WorldDominator

0

Так как вы храните Strings, сортируя их по их значению String. Вам нужно будет преобразовать их в нечто вроде Decimals (что рекомендуется для работы с деньгами), и тогда вы сможете их отсортировать.

#Hint: 

from decimal import Decimal 

dollarString = '$100.00' 

dollarDecimal = Decimal(dollarString.strip('$')) 
3

Это происходит потому, что вы сортировку строк, которые отсортированы в лексикографическом (порядок, в котором оно будет отображаться, если он был в английском словаре).

Что вы хотите, чтобы отсортировать их по floatified ценности, которые можно сделать так:

>>> money = { '$100.00' : 0, '$50.00' : 0, '$20.00' : 0,'$10.00' : 0, 
...    '$5.00' : 0, '$1.00' : 0,'$0.25' : 0, '$0.10' : 0, '$0.05' : 0, 
...    '$0.01' : 0} 
>>> for val in sorted(money, key=lambda s: float(s.lstrip("$"))): 
...  print(val, money[val]) 
... 
$0.01 0 
$0.05 0 
$0.10 0 
$0.25 0 
$1.00 0 
$5.00 0 
$10.00 0 
$20.00 0 
$50.00 0 
$100.00 0 
0

Если вы не возражаете, сторонние библиотеки, проверить natsort. Он предназначен для ситуаций точно как этот

import natsort 
money = { '$100.00' : 0, '$50.00' : 0, '$20.00' : 0,'$10.00' : 0, 
      '$5.00' : 0, '$1.00' : 0,'$0.25' : 0, '$0.10' : 0, '$0.05' : 0, 
      '$0.01' : 0} 
keylist = natsort.natsorted(money) 
print(keylist) 
# prints ['$0.01', '$0.05', '$0.10', '$0.25', '$1.00', '$5.00', '$10.00', '$20.00', '$50.00', '$100.00'] 

Или, если вы хотите, чтобы на месте рода:

keylist = list(money) 
keylist.sort(key=natsort.natsort_key) 
print(keylist) 
# prints ['$0.01', '$0.05', '$0.10', '$0.25', '$1.00', '$5.00', '$10.00', '$20.00', '$50.00', '$100.00'] 

Natsort автоматически обрабатывает числа внутри строки, так что вы получите естественный порядок сортировки, а не лексикографический порядок ,

Смежные вопросы