Python - 如何根据字典及其键来对字典进行排序

时间:2015-02-27 10:10:47

标签: python dictionary tuples

我有一本字典: -

{
 (1, 1): 16,
 (1, 2): 16,
 (1, 3): 16,
 (1, 4): 16,
 (2, 1): 24,
 (2, 2): 24,
 (2, 3): 24,
 (2, 4): 24   }

...我希望它按照元组键的第二个字段以及字典的值字段进行排序...所以结果字典应该是: -

{
 (2, 1): 24,
 (2, 2): 24,
 (2, 3): 24,
 (2, 4): 24, 
 (1, 1): 16,
 (1, 2): 16,
 (1, 3): 16,
 (1, 4): 16 
}

...我尝试单独使用值进行排序,但它会使按键元组顺序混乱....是的,所以我之后将其分配到列表中......

list = sorted(unsorted_dict, key = unsorted_dict.__getitem__, reverse=True)....

很抱歉说,但部分回答我的情况......

我不想考虑排序的第一个值..我说我有初始数据......

{
 (5, 1): 16,
 (6, 2): 16,
 (7, 3): 16,
 (8, 4): 16,
 (4, 1): 24,
 (3, 2): 24,
 (2, 3): 24,
 (1, 4): 24   }

我想要输出......

{
     (4, 1): 24,
     (3, 2): 24,
     (2, 3): 24,
     (1, 4): 24,     
     (5, 1): 16,
     (6, 2): 16,
     (7, 3): 16,
     (8, 4): 16        }

....正如我所说,我想考虑排序的元组第二值而不考虑排序的所有第一个值...如果有人能说出来,那将是一个很大的帮助。 .how我是否将这个排序字典中的元组提取到类似的列表中。

(4,1),(3,2),(2,3),(1,4),(5,1),(6,2),(7,3),(8,4)

编辑:所以评论有助于得到我想要的东西...非常感谢...

list_sorted = sorted(unsorted_dict.items(),key=lambda x: (-x[1],x[0][1])) 
for val in list_sorted: 
   final_list.append(val[0])

更正了键值组,感谢@Padraic Cunningham指出它

1 个答案:

答案 0 :(得分:3)

dicts没有订单,您可以对商品进行排序:

d={
 (1, 1): 16,
 (1, 2): 16,
 (1, 3): 16,
 (1, 4): 16,
 (2, 1): 24,
 (2, 2): 24,
 (2, 3): 24,
 (2, 4): 24   }

from pprint import pprint as pp

pp(sorted(d.items(),key=lambda x: (-x[1],x[0])))
[((2, 1), 24),
 ((2, 2), 24),
 ((2, 3), 24),
 ((2, 4), 24),
 ((1, 1), 16),
 ((1, 2), 16),
 ((1, 3), 16),
 ((1, 4), 16)]

如果你真的想要一个带有项目的dict,你可以从已排序的项目中创建collections.OrderedDict

from collections import OrderedDict

od = OrderedDict(sorted(d.items(),key=lambda x: (-x[1],x[0])))
OrderedDict([((2, 1), 24), ((2, 2), 24), ((2, 3), 24), ((2, 4), 24), ((1, 1), 16), ((1, 2), 16), ((1, 3), 16), ((1, 4), 16)])

我们的主要排序键是每个值,通过用-否定每个值从高到低排序,然后我们断开与从低到高的键/元组排序的关系。

通过元组中的第二个元素断开关系:

pp(sorted(d.items(),key=lambda x:(-x[1],x[0][1])))

您编辑的输出现在具有不同的键,具有不同的值,因此不确定排序可以做到这一点。