目前,我有一个列表,用他们的考试成绩代表学生
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)
我如何首先对分数进行排序,然后对名称进行排序?
答案 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
的每个元素转换成一个元组,其中第一个元素是得分,第二个元素是名称。请注意,以上解决方案假定您首先要获得最低的分数。
进一步
请注意,选择排序的复杂度为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()]