我仍在学习 Python,我已经尝试解决这个问题好几个小时了,但不知何故无法让它工作: 假设我们有一个包含姓名和成绩的元组列表:
[("Mark", [5,4,1,2,4,3]), ("John", [1,2,3,1,2,1]), ("Patrick", [1,3,5,1,2,4])]
我们想要得到这个输出:
[("John", [1,2,3,1,2,1]), ("Patrick", [1,3,5,1,2,4]), ("Mark", [5,4,1,2,4,3])]
,其中原始列表按学生的marks score升序排序(假设我们通过丢弃最高分并将所有剩余分数加在一起得到marks score ). IE。 John 有标记 1,2,3,1,2,1,所以我们舍弃标记 3 并将 1+2+1+2+1 加在一起,得到 7。
如果我不需要获得带有所有原始标记的输出,这个任务根本不会有问题。我写了这个函数:
def sortedFinalRes(input):
finalRes = 0
sortedRes = []
b = []
for i in range(0, len(input)):
total = 0
a = sorted(input[i][1], key = lambda x: x)
a.pop()
sortedRes += input[i][0], a
total = sum(sortedRes[i*2+1])
b += (sortedRes[i*2], total)
c = sorted(b, key = lambda x: str(x))
print(sortedRes)
print(b)
,我基本上首先对每个学生的分数进行排序,这样我就可以使用 pop() 丢弃最高的分数,然后我将所有剩余的分数相加,得到分数。然后我按照marks score排序,但是输出要求是排序的,但是要带original marks,不能带mark score。 任何想法表示赞赏!干杯
请您参考如下方法:
我们可以这样定义一个评分函数:
def score(x): sum(x) - max(x)
这通过将分数相加并剔除最高分数来计算您所谓的“分数”。然后我们将它用作排序的键,确保给它元组的第二个元素:
In [4]: sorted(d, key=lambda x: score(x[1]))
Out[4]:
[('John', [1, 2, 3, 1, 2, 1]),
('Patrick', [1, 3, 5, 1, 2, 4]),
('Mark', [5, 4, 1, 2, 4, 3])]
