如何在Python字典中正确排序项目?

如何在Python字典中正确排序项目?,python,dictionary,Python,Dictionary,我已经用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} 然而,当我想打印这个时,我似乎无法从“最小”到“最大”的货币进行打印 这是我在尝试对其进行排序时所做的

我已经用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…?

排序是按字典顺序进行的,即按字母顺序,一次一个字符。更改排序函数以删除美元符号并转换为浮动:

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

或者更好的方法是,从键中删除
“$”
,将键保留为浮点数,并且在打印时只添加
“$”
。排序按字典顺序进行,即按字母顺序,一次一个字符。更改排序函数以删除美元符号并转换为浮动:

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

或者更好的方法是,从键中删除
“$”
,将键保留为浮点数,并且在打印时只添加
“$”
,因为您存储的是
字符串
,它会按其
字符串
值对其进行排序。您需要将它们转换为类似于
小数
(建议用于处理金钱),然后才能对它们进行排序

#Hint:

from decimal import Decimal

dollarString = '$100.00'

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

由于您存储的是
字符串
,因此它将根据字符串的
值对其进行排序。您需要将它们转换为类似于
小数
(建议用于处理金钱),然后才能对它们进行排序

#Hint:

from decimal import Decimal

dollarString = '$100.00'

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

发生这种情况是因为您正在对字符串进行排序,这些字符串是按字典顺序排序的(如果是在英语字典中,则按其显示的顺序)

您需要的是按照它们的浮动值对它们进行排序,可以这样做:

>>> 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

发生这种情况是因为您正在对字符串进行排序,这些字符串是按字典顺序排序的(如果是在英语字典中,则按其显示的顺序)

您需要的是按照它们的浮动值对它们进行排序,可以这样做:

>>> 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

如果您不介意第三方库,请查看。它是专为这种情况设计的

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会自动处理字符串中的数字,因此您可以获得自然的排序顺序,而不是字典顺序。

如果您不介意第三方库,请查看。它是专为这种情况设计的

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自动处理字符串中的数字,因此您可以获得自然的排序顺序,而不是字典顺序