在排序之前将字典值转换为十进制或浮点数

时间:2014-04-01 16:27:27

标签: python sorting python-3.x dictionary

我的词典中有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,以便对值进行正确排序?

1 个答案:

答案 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')]