对多个参数进行排序的函数

Function that sorts multiple arguments

我需要编写一个函数 sort_gradebook(gradebook),它有下一个参数:[first_name, last_name, grade_1, grade_2, ..., grade_n, final_grade]。函数必须排序:

我能做的一切:

from operator import itemgetter

def sort_gradebook(*gradebook):
    length = len([str(i) for i in gradebook[0]])
    a = [i for i in range(length)]
    for i in a:
        s = sorted(gradebook, key = itemgetter(i))

    return s

测试:

from itertools import permutations

def test_sort(inp, outp):
    for i in permutations(inp):
        assert sort_gradebook(list(i)) == outp

test_sort([['Alice', 'Smith', 2, 3, 4],
    ['John', 'Smith', 2, 3, 5]], [['John', 'Smith', 2, 3, 5],
    ['Alice', 'Smith', 2, 3, 4]
])

正在排序

  • 您想对多个参数进行排序,即不同的索引。您可以使用 itemgetter(0,1,2),在您的情况下 itemgetter(4,3,2,1,0) 需要根据大小

  • 动态构建
  • 添加 reverse=True 以获得最终成绩更高的约翰,在爱丽丝之前

def sort_gradebooks(*gradebooks):
    nb_attributes = len(gradebooks[0])
    s = itemgetter(*[i for i in range(nb_attributes - 1, -1, -1)]) # itemgetter(4,3,2,1,0)
    return sorted(gradebooks, key=s, reverse=True)

调用它

您需要使用 *ii 调用排序以传递展平参数,而不是传递一个列表,而是传递多个项目

def test_sort(inp, outp):
    for i in permutations(inp):
        print(sort_gradebooks(*i) == outp)

print(sort_gradebooks(*[['Alice', 'Smith', 2, 3, 4], ['John', 'Smith', 2, 3, 5]])) # John / Alice because final grade
print(sort_gradebooks(*[['Alice', 'Smith', 2, 3, 5], ['John', 'Smith', 2, 3, 5]])) # John / Alice because name
print(sort_gradebooks(*[['Alice', 'Smith', 2, 5, 5], ['John', 'Smith', 2, 3, 5]])) # Alice / John because 2ng grade