我的词典中有name: number
对。
名称和数字都存储为字符串,但在使用前始终将数字转换为小数。如果我尝试按值对字典进行排序,则将该值用作字符串,然后根据该字符串而不是按十进制表示法对其进行排序。
以下代码演示了这一点:
import collections
import operator
from decimal import *
TWODECIMALPLACES = Decimal(10) ** -2
adict = {'fred': Decimal(6.56).quantize(TWODECIMALPLACES),
'paul': Decimal(47.91).quantize(TWODECIMALPLACES),
'george': Decimal(2.59).quantize(TWODECIMALPLACES),
'ringo': Decimal(11.50).quantize(TWODECIMALPLACES),
'john': Decimal(1.57).quantize(TWODECIMALPLACES)}
bdict = {'fred': "6.56", 'paul': "47.91", 'george': "2.59",
'ringo': "11.50", 'john': "1.57"}
print ("adict" + str(adict) + "\n")
print ("bdict" + str(bdict) + "\n")
sadict = sorted(adict.items(), key=operator.itemgetter(1), reverse = True)
sbdict = sorted(bdict.items(), key=operator.itemgetter(1), reverse = True)
print ("sadict " + str(sadict) + "\n")
print ("sbdict " + str(sbdict) + "\n")
for idx, item in enumerate(sadict):
print (str(sadict[idx][0]) + " : " + str(sadict[idx][1]))
for idx, item in enumerate(sbdict):
print (str(sbdict[idx][0]) + " : " + str(sbdict[idx][1]))
如何在排序之前将字典值转换为float或decimal,以便对值进行正确排序?
答案 0 :(得分:2)
对key
使用lambda sorted()
函数:
sorted(bdict.items(), key=lambda i: float(i[1]), reverse=True)
而不是operator.itemgetter(1)
在排序时将值转换为浮点值。毕竟,key
参数可以是任何可调用的参数。
演示:
>>> bdict = {'fred':"6.56",'paul':"47.91",'george':"2.59",'ringo':"11.50",'john':"1.57"}
>>> sorted(bdict.items(), key=lambda i: float(i[1]), reverse=True)
[('paul', '47.91'), ('ringo', '11.50'), ('fred', '6.56'), ('george', '2.59'), ('john', '1.57')]