微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

使用装饰器按特定条件排序-Python

如何解决使用装饰器按特定条件排序-Python

像这样的列表中有名字,分数和班级

students = [['Paul',90,'a'],['Michael',50,'b'],['Gina','c'],['Marie',70,'b']]

每个班级都有口号:

a   Good A 
b   Great B 
c   Best C 

列表应按得分较高排序,并根据排序顺序打印名称和口号(如果2个或更多的ppl具有相同的得分,则从较高的索引打印)

因此,根据以上列表的输出应为:

Best C: Gina
Good A: Paul
Great B: Marie
Great B: Michael

首先,我尝试了2种功能,一种是对列表进行排序,另一种是打印输出,并且效果很好。

然后我想在上面添加装饰器,但是由于我不习惯使用装饰器,因此我几乎没有完成这样的编码。

def do_sort(students):
    def takeSecond(elem):
      return elem[1]
    students.sort(key=takeSecond)
    sorted_students = []
    for student in students:
      sorted_students.append(student)

    return sorted_students
 
def get_list(func):
    def decorated(students):
      a = 'Good A'
      b = 'Great B' 
      c = 'Best C'
      do_sort(students)
      newlist = []
      for student in students:
        if student[2] == 'a':
          student[2] = a
        elif student[2] == 'b':
          student[2] = b
        elif student[2] == 'c':
          student[2] = c
        newlist.append('{}:{}'.format(student[2],student[0]))
        # del newlist[0]
        result = []
        result.append(newlist[::-1])
      for each in result:
        return result.pop()
    return decorated
 
@get_list
def print_output(each_student):
     output = each_student
     return output
 
students = [['Paul','b']]
print(*print_output(students),sep='\n')

尽管它给出了正确的结果,但由于我在get_list函数中做了几乎所有事情,因此似乎并不需要真的使用print_output函数(由get_list装饰)。

我想知道这是否是使用装饰器的正确方法。 如果不是这样,我想知道一种更好的方法,因为我现在陷入了这一观念。感谢对代码进行任何更正。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。