2014-04-01 28 views
0

我有一個包含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])) 

如何我所以正確排序值進行排序之前投的字典值的浮動或十進制?

回答

2

使用lambda key函數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')] 
+1

謝謝,這工作,但我從來不知道如何閱讀或理解lambda函數。我有複製粘貼他們幾次,他們的工作,但我不知道如何......他們不完全可讀。 – Zac

+1

@Zac:'lambda參數:expr'就像'def functionname(arguments):return expr'。所以'lambda i:float(i [1])'和def key_function(i):return float(i [1])'是一樣的,但沒有名字。 –

+0

將'lambda i:float(i [1])'改爲'lambda i:(-float(i [1]),i [0])'和'reverse = False'可以按值降序排列,在關係的情況下,按字母順序排列。 'key'返回的值不一定是數字,它可以是可以排序的東西。 – Bakuriu

相關問題