选择排序问题(学生成绩)

时间:2018-12-01 11:58:39

标签: python python-3.x

目前,我有一个列表,用他们的考试成绩代表学生 a = [['May', 81], ['Jack', 91], ['Mike', 52], ['Jeremy', 58], ['Mark', 71],['Sam',81],['Brian',61],['Yan',71]]

我希望先使用选择排序对分数进行排序,然后再按字母顺序对学生姓名进行排序。

我是初学者,只知道如何对

这样的普通列表进行排序
a = [1,64,23,13]

将给出:a = [1,13,23,64]

我的选择排序代码在这里:

def sort(a):
    for i in range(len(a)):
        min_item = min(a[i:])
        index = a.index(min_item)
        a[i],a[index] = a[index],a[i]
    print(a)

我如何首先对分数进行排序,然后对名称进行排序?

3 个答案:

答案 0 :(得分:1)

函数min可以与自定义键结合使用:

def selection_sort(lst):
    for i in range(len(lst)):
        min_item = min(lst[i:], key=lambda x: (x[1], x[0]))
        index = lst.index(min_item)
        lst[i], lst[index] = lst[index], lst[i]
    print(lst)

a = [['Brian', 61], ['Jack', 91], ['Jeremy', 58], ['Mark', 71], ['May', 81], ['Mike', 52], ['Sam', 81], ['Yan', 71]]

selection_sort(a)

输出

[['Mike', 52], ['Jeremy', 58], ['Brian', 61], ['Mark', 71], ['Yan', 71], ['May', 81], ['Sam', 81], ['Jack', 91]]

key lst的每个元素转换成一个元组,其中第一个元素是得分,第二个元素是名称。请注意,以上解决方案假定您首先要获得最低的分数。

进一步

  1. How does tuple comparison work in Python?

请注意,选择排序的复杂度为O(n^2),最好使用内置的.sort方法,复杂度O(nlogn)。用法示例:

a.sort(key=lambda x: (x[1], x[0]))
print(a)

输出

[['Mike', 52], ['Jeremy', 58], ['Brian', 61], ['Mark', 71], ['Yan', 71], ['May', 81], ['Sam', 81], ['Jack', 91]]

答案 1 :(得分:1)

如果您要按分数排序,然后再命名,则可以使用itemgetter-this will be faster than using lambda and avoids using python function call

from operator import itemgetter
sorted(a, key=itemgetter(1,0))

这将导致:

 [['Mike', 52],
 ['Jeremy', 58],
 ['Brian', 61],
 ['Mark', 71],
 ['Yan', 71],
 ['May', 81],
 ['Sam', 81],
 ['Jack', 91]]

答案 2 :(得分:1)

您可以使用numpy

import numpy as np
a = [['Brian', 61], ['Jack', 91], ['Jeremy', 58], ['Mark', 71], ['May', 81], ['Mike', 52], ['Sam', 81], ['Yan', 71]]
a = np.array(a)
a[a[:,1].argsort()]