2012-10-22 121 views
2

我有一本字典,其中每個鍵都有一個列表作爲值。每個列表都有一個或多個元組,內有2個項目,一個整數,一個字符串。Python複雜的字典排序

例子:

my_dict = {'dict_key_1': [(100, 'string_x1234'), (95, 'string_rtx3') ..], 
      'dict_key_2': [(26, 'string_abc3'), (321, 'string_432fd'), ...], 
      'dict_key_3': [(32, 'string_232df']} 

我循環通過這本詞典,並同時做,通過列表中的項目。

但是,在這兩次迭代中,我必須按照列表中任何元組的第一項的最高值對字典進行排序。

在這種情況下

所以,既然是最高的,我會得到dict_key_2第一,其項目將開始其第一個項目是元組上市,那麼等。

我很好的第二次迭代(排序元組的列表)與:

sorted(data[k], reverse = True) 

但我目前無法在分揀依賴任何元組的最高值主詞典在列表中的那個關鍵的字典是持有的。我目前有:

for k in sorted(data, key=lambda k: sorted(data[k])[0][0]): 

但是,它不工作。但是,當我嘗試打印sorted(data[k])[0][0])而迭代,它確實給第一個值[0]第一個元組[0]具有它在該列表中下令對所有元組的第一個值之後(data[k]

我是什麼做錯了?我怎樣才能得到這個字典按需要排序?

謝謝。

回答

1

使用max

for k in sorted(data, key=lambda k: max(data[k]), reverse=True): 
2

如果你不介意的排序在字典的名單,我建議這樣做兩遍:

for L in my_dict.itervalues(): 
    L.sort(reverse=True) 

import collections 
my_sorted_dict = collections.OrderedDict((k, my_dict[k]) for k in sorted(my_dict, key=my_dict.get, reverse=True)) 
+0

更容易(和更高效)使用:'OrderedDict(sorted(my_dict.iteritems(),key = itemgetter (1),reverse = True))' –

+0

是的,謝謝,這是更優雅 – wim

1

下面的代碼片段會給你一個新的分類字典:

from collections import OrderedDict 

my_dict = {'dict_key_1': [(100, 'string_x1234'), (95, 'string_rtx3')], 
      'dict_key_2': [(26, 'string_abc3'), (321, 'string_432fd')], 
      'dict_key_3': [(32, 'string_232df')]} 

sorted_my_dict = OrderedDict(sorted(my_dict.iteritems(), 
            key=lambda (k, v): max(v), 
            reverse=True)) 
+0

從排序列表中創建一個'dict'只會破壞排序順序... – nneonneo

+0

我的不好,我只是忘了使用OrderedDict。 –