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

时间:2014-02-06 01:53:04

标签: 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}

然而,当我想要打印时,我似乎无法从“最少到最大”的货币中做到这一点。

这是我在尝试对其进行排序时所做的:

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

然而,给出的结果来自...... $ 1 - > 10美元 - > 100美元 - > 20美元...任何建议,所以它将是$ 1 - > $ 5 - > $ 10 ...?

4 个答案:

答案 0 :(得分:3)

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

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

或者更好的是,从密钥中移除"$",使密钥保持浮动状态,并且仅在打印时添加"$"

答案 1 :(得分:3)

这种情况正在发生,因为您正在排序字符串,这些字符串按字典顺序排序(如果它出现在英语词典中,它将显示在其中的顺序)。

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

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

答案 2 :(得分:0)

由于您要存储Strings,因此会按String值对其进行排序。您需要将它们转换为Decimals(建议处理金钱),然后您就可以对它们进行排序。

#Hint:

from decimal import Decimal

dollarString = '$100.00'

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

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