【问题标题】:Python - How to sort a dictionary based on its value as well it keyPython - 如何根据字典的值和键对字典进行排序
【发布时间】:2015-02-27 10:10:46
【问题描述】:

我有一本字典:-

{
 (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 
}

...我尝试单独使用 value 对其进行排序,但它弄乱了键元组的顺序 .... 是的,所以我后来通过这样做将它分配给了一个列表 ...

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        }

....正如我所说,我想考虑元组的 second 值进行排序,而根本不考虑排序的第一个值...如果有人能说出这将是一个很大的帮助。 .我如何从这个排序的字典中提取元组到一个类似的列表中..

(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 指出

【问题讨论】:

  • 但是字典是无序的。
  • 我可以在之后删除值并获取元组列表。所以基本上值可以帮助我排序(我优先使用它)...我感兴趣的是列表元组及其根据分配给它们的优先级的顺序

标签: python dictionary tuples


【解决方案1】:

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)]

如果你真的想要一个包含项目的字典,你可以从排序的项目中创建一个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])))

您编辑的输出现在有不同的键和不同的值,所以不确定排序如何做到这一点。

【讨论】:

  • @Lafada。我已经放弃试图找出反对意见了!
  • 第二个是我 :D 我认为否决的选民没有看到您的编辑!所以 Pluse 1 ;)
  • OK 所以 -x[1] 这里代表字典中的值。和..x[0] .. 元组字段之一..但是它考虑哪些元组字段对第一个或第二个进行排序..我无法弄清楚...
  • @user1107108, x[0] 元组,不是一个字段。
  • 是的......所以它在什么基础上对这些元组进行排序......因为我有两个值......我希望根据第二个值进行排序......对不起,如果使用错误任何地方的术语.. 对 python 来说非常新
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-11
  • 1970-01-01
  • 2013-09-27
  • 1970-01-01
  • 2018-08-13
相关资源
最近更新 更多