对多个参数进行排序的函数
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)
调用它
您需要使用 *i
和 i
调用排序以传递展平参数,而不是传递一个列表,而是传递多个项目
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
我需要编写一个函数 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)
调用它
您需要使用 *i
和 i
调用排序以传递展平参数,而不是传递一个列表,而是传递多个项目
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