【问题标题】:How to sort a dictionary of nested lists by value with one key ascending and one key descending?如何通过一键升序和一键降序按值对嵌套列表的字典进行排序?
【发布时间】:2021-05-19 01:19:38
【问题描述】:

我正在解决一个问题,说明如下:

编写一个函数,根据阈值区分接受和拒绝的学生。 该函数应称为 select_student 并作为参数: 一个列表,其中每个元素都是一个学生姓名和他的标记的列表。 标记。学生的分数必须高于或等于给定的分数才能被接受。 您的函数必须返回一个包含两个条目的字典: Accepted 列出了按分数降序排列的被录取学生。 拒绝 哪些被拒绝的学生按分数升序排列。 示例

In [1]: from solution import select_student

In [2]: my_class = [['Kermit Wade', 27], ['Hattie Schleusner', 67], ['Ben Ball', 5], ['William Lee', 2]]

In [3]: select_student(my_class, 20)
Out[3]:
{'Accepted': [['Hattie Schleusner', 67], ['Kermit Wade', 27]],
 'Refused': [['William Lee', 2], ['Ben Ball', 5]]}

In [4]: select_student(my_class, 50)
Out[4]:
{'Accepted': [['Hattie Schleusner', 67]],
 'Refused': [['William Lee', 2], ['Ben Ball', 5], ['Kermit Wade', 27]]}

我的代码是:

from collections import OrderedDict

students = [
            ["Kermit Wade", 27],
            ["Hattie Schleusner", 67],
            ["Ben Ball", 5],
            ["William Lee", 2],
        ]

def select_student(students, threshold):
    output = {
        'Accepted' : [],
        'Refused' : []
    }
    for i in range(len(students)):
        if students[i][1] >= threshold:
            output['Accepted'].append(students[i])
        elif students[i][1] < threshold:
            output['Refused'].append(students[i])
    return output

我的输出是:

{'Accepted': [['Kermit Wade', 27], ['Hattie Schleusner', 67]], 'Refused': [['Ben Ball', 5], ['William Lee', 2]]}

输出是针对这些参数的

print(select_student(students, 20))

如您所见,我需要颠倒接受和拒绝的顺序。所以海蒂先接受,然后威廉先拒绝。

我尝试使用 OrderedLists 和谷歌搜索,但由于问题所需的嵌套列表结构,我找不到按等级排序的方法,也找不到根据字典的升序和降序排序的方法键。

提前致谢!

【问题讨论】:

  • 字典是默认排序的,只要你使用的是python3.6+
  • 如何按一个键升序,另一个键降序排列?

标签: python-3.x ordereddictionary


【解决方案1】:

修改您的选择学生功能,以按如下方式对您的接受和拒绝列表进行排序:

def select_student(students, threshold):
    output = {
        'Accepted' : [],
        'Refused' : []
    }
    for i in range(len(students)):
        if students[i][1] >= threshold:
            output['Accepted'].append(students[i])
        elif students[i][1] < threshold:
            output['Refused'].append(students[i])
    output['Accepted'] = sorted(output['Accepted'], key= lambda x: x[1], reverse= True)
    output['Refused'] = sorted(output['Refused'], key = lambda x: x[1])
    return output

【讨论】:

  • 非常感谢!我试图通过 dict 对输出进行排序然后使用下标所以 output[0][1] (这显然不起作用)而不是在键中排序,所以我出错了。我也必须重新学习我的 lambda 用法 - 经验教训!
  • 很高兴我能帮上忙
猜你喜欢
  • 2020-12-10
  • 1970-01-01
  • 2015-03-31
  • 2019-02-08
  • 2021-12-20
  • 1970-01-01
  • 1970-01-01
  • 2019-12-30
  • 1970-01-01
相关资源
最近更新 更多