2017-10-11 59 views
1

我定義爲這樣一本詞典:Python的 - 排序漢語詞典絕對值

dict: {'KEY1': Decimal('-6.20000'), 'KEY2': Decimal('-2.58000'), 'KEY3': Decimal('6.80000')} 

,我想有一張列表或絕對值訂購的鍵/值對的OrderedDict。

我想:

sorted_dict = sorted(mydict, key=lambda k: abs(mydict[k]), reverse=True) 

但這僅返回鍵的列表,沒有相應的值,但他們似乎由絕對值排序。

我怎樣才能得到OrderedDict或包含鍵和值的元組列表,但是按絕對值排序?

+0

'排序((ABS(K ),v)for k,v in d.items(),reverse = True)'Is one way –

+0

我得到一個錯誤: sorted_dict = sorted((abs(k),v)for k,v in dict.items (),如果不是唯一的參數 –

+0

並且當我將它改爲sorted_dict = sorted(((abs(k),v)for k,v in dict.items()),則生成器表達式必須加括號, ('=','=','=','=');我得到另一個錯誤: 貿易循環錯誤:(,TypeError(「bad操作數類型爲abs():'str'」,),

回答

1

你只需要一個從字典.items()查看收到一個(鍵,值)元組並返回該值的絕對值的關鍵功能。例如:

from decimal import Decimal 
from collections import OrderedDict 

data = {'KEY1': Decimal('-6.20000'), 'KEY2': Decimal('-2.58000'), 'KEY3': Decimal('6.80000')} 
out = OrderedDict(sorted(data.items(), key=lambda t: abs(t[1]))) 
print(out) 

輸出

OrderedDict([('KEY2', Decimal('-2.58000')), ('KEY1', Decimal('-6.20000')), ('KEY3', Decimal('6.80000'))]) 

這是更容易,如果我們用正確的def功能鍵功能讀一點:

def keyfunc(t): 
    return abs(t[1]) 

out = OrderedDict(sorted(data.items(), key=keyfunc)) 
+0

完美的作品,謝謝!起初我以爲OrderedDict轉換搞亂了順序,但這只是eclipse調試器顯示它的方式 - 它通過鍵名重新排列字典條目...將其打印到控制檯輸出顯示正確的順序。 –

+0

@VincentL啊!是的,有幾個IDE可以「幫助」按鍵排列字典。但你會認爲他們會很聰明,不會對OrderedDict的排序進行排序... –

+0

@VincentL在相關說明中,查看[在kwargs中使用OrderedDict](https://stackoverflow.com /問題/ 26748097 /使用-AN-ordereddict合kwargs) –

1

你在正確的軌道上。使用.items並將生成的元組對傳遞給OrderedDict構造函數。

from collections import OrderedDict 

values = { 
    'KEY1': Decimal('-6.20000'), 
    'KEY2': Decimal('-2.58000'), 
    'KEY3': Decimal('6.80000') 
} 

sorted_pairs = sorted(values.items(), key=lambda k: abs(k[1]), reverse=True) 
ordered_dict = OrderedDict(sorted_pairs) 
+1

謝謝。這與PM 2Ring的答案相同。我發現它幾乎在同一時間發佈,所以我想你還沒有看到他。我已經接受了他的答案,但感謝您的意見:) –