2012-10-22 93 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。 –