2009-07-06 32 views
1

好吧,我有這樣的列表(只是一個數據的樣本):在檢查字符串或浮點數時按鍵排序Python列表?

data = {"NAME": "James", "RANK": "3.0", "NUM": "27.5" ... } 

現在,如果我跑是這樣的:

sortby = "NAME" //this gets passed to the function, hence why I am using a variable sortby instead 
data.sort(key=itemgetter(sortby)) 

我得到的所有字符串進行排序正確 - 按字母順序。

然而,當「sortby」是任何浮動值(RANK或NUM或任何其他),排序再次完成後,按字母順序排列,而不是數字的,所以我的排序列表看起來是這樣的,那麼:

0.441 101.404 107.558 107.558 108.48 108.945 11.195 12.143 12.801 131.73

這顯然是錯誤的。現在,我該如何做一個這樣的排序(在速度和資源/計算方面最有效率),但是當它是一個浮點數時,它會將浮點值轉換爲浮點數,並且當它是一個浮點數時將其保留爲一個字符串字符串...可能嗎?不,刪除列表中的浮點值引號不是一個選項 - 我無法控制源列表,不幸的是(我知道,這將是一個簡單的解決方案)。

回答

7

如果你想,你可以作爲參數傳遞給sort(key=XXX)一般的功能,那麼這裏就是完整的候選人與測試:

DATA = [ 
    { 'name' : 'A', 'value' : '10.0' }, 
    { 'name' : 'B', 'value' : '2.0' }, 
] 

def get_attr(name): 
    def inner_func(o): 
     try: 
      rv = float(o[name]) 
     except ValueError: 
      rv = o[name] 
     return rv 
    return inner_func 

for attrname in ('name', 'value'): 
    DATA.sort(key=get_attr(attrname)) 
    print "%r-sorted: %s" % (attrname, DATA) 

當你運行上面的腳本,您可以:

'name'-sorted: [{'name': 'A', 'value': '10.0'}, {'name': 'B', 'value': '2.0'}] 
'value'-sorted: [{'name': 'B', 'value': '2.0'}, {'name': 'A', 'value': '10.0'}] 
0

不僅僅是傳遞一個字段的名稱稍微詳細,但是這是一個選項:

sort_by_name = lambda x: x['name'] 
sort_by_rank = lambda x: float(x['RANK']) 
# etc... 

data.sort(key=sort_by_rank) 

如果數據比你貼什麼更密集,您可能需要一個單獨的字典映射字段名數據類型,然後一個工廠函數產生適合key參數list.sort()

4

分揀機,如果你不能正確地保存數據(如浮浮),像這樣

sorters = { "NAME" : itemgetter("NAME"), 
      "RANK" : lambda x: float(x["RANK"]), 
      "NUM" : lambda x: float(x["NUM"]) 
} 

data.sort(key=sorters[sortby]) 
+0

我喜歡這樣的......從來沒有想過用於排序類型的單獨字典。謝謝!唯一的問題是,有50列我需要投這樣的浮動,但它是迄今爲止最流暢的方法... – 2009-07-06 18:21:16

+0

檢查我的答案,不需要單獨的字典。這是一個很好的答案,但是您必須設置50條字典...... – 2009-07-06 18:33:10