按值排序Python字典;值是一个两项列表;对第一个列表项进行常规排序,对第二个列表项进行反向排序

2024-04-29 09:04:32 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个字典,它的值都是两个项目列表(关键是一个六个项目的元组,但我们不讨论它)

下面是一个可视化:

my_ridiculous_dict = {
    ('0', '2', '0', '4', '0', '1'): [1, 1000], 
    ('5', '3', '0', '2', '0', '0'): [1, 400], 
    ('3', '6', '0', '2', '0', '0'): [2, 3000], 
    ('4', '3', '0', '2', '0', '0'): [2, 80], 
    ('0', '0', '3', '9', '0', '3'): [3, 0]
}

我需要先按值列表中的第一项对其进行排序,然后对第二项进行反向排序。因此,您在上面看到的内容将被正确排序

如果已经解决了这个问题,我深表歉意,但是我所看到的关于按值对字典排序的所有问题似乎都假设一个简单的int或str作为值,&;考虑到这种增加的复杂性,我很难理解lambdas或itemgetter的使用

应该提到的是,我不介意在两个关卡中做这件事,只是想完成

非常感谢


Tags: 项目内容列表字典排序my可视化dict
2条回答

字典不是用来排序的,但是如果您将项目复制到列表中,您可以对列表进行排序

mrd = {
('4', '3', '0', '2', '0', '0'): [2, 80], 
('0', '2', '0', '4', '0', '1'): [1, 1000], 
('3', '6', '0', '2', '0', '0'): [2, 3000], 
('5', '3', '0', '2', '0', '0'): [1, 400], 
('0', '0', '3', '9', '0', '3'): [3, 0]
}

lst = list(mrd)
lst.sort(key=lambda x:[mrd[x][0], -mrd[x][1]])
for i in lst: print(i, mrd[i])

输出:

('0', '2', '0', '4', '0', '1') [1, 1000]
('5', '3', '0', '2', '0', '0') [1, 400]
('3', '6', '0', '2', '0', '0') [2, 3000]
('4', '3', '0', '2', '0', '0') [2, 80]
('0', '0', '3', '9', '0', '3') [3, 0]

Python使用稳定排序

更通用的解决方案依赖于排序在Python中是稳定的这一事实。这意味着,如果两个项目排序相同,那么它们将保留其原始顺序

要获得所需的内容,请按第二个值进行反向排序。使用my_dict.items()获取(键,值)元组t[1][1]是第二个值

items = sorted(my_dict.items(), key=lambda t:t[1][1], reverse=True)

然后按第一个值排序

items.sort(key=lambda t:t[1][0])

在当前版本的Python中,DICT以键插入顺序维护项。因此,您可以通过以下方式创建已排序的dict:

my_sorted_dict = dict(items)

使用运算符.itemgetter()

我看不到在嵌套数据结构上使用itemgetter的方法,例如我的dict.items()提供的(键[value1,value2])。因此,要使用operator.itemgetter(),需要将结构展平

import operator

items = [(k, *v) for k,v in my_dict.items()]

这将它转换为一个元素元组,如:(k,value1,value2)

现在像以前一样对列表进行排序;第二个元素,然后是第一个元素operator.itemgetter(n)创建并返回一个函数,该函数接受一个对象并调用该对象上的__getitem__(n)。因此,这些行对项中的每个项执行按项[2]键控的反向排序,然后执行按项[1]键控的排序

items.sort(key=operator.itemgetter(2), reverse=True)
items.sort(key=operator.itemgetter(1))

然后,听写理解构建排序的听写:

my_sorted_dict = {k:[v1,v2] for k,v1,v2 in items}

我的字典

相关问题 更多 >