我还在学习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])]
,原始列表按照学生分数分数的升序排序(假设我们通过丢弃最高分并将所有剩余分数加在一起来获得分数 )。 即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()丢弃最高分,然后我将所有剩余分数排除,这给了我分数。然后我根据标记得分对其进行排序,但输出需要进行排序,但是使用原始标记,而不是标记得分。 任何想法赞赏!干杯
答案 0 :(得分:5)
我们可以像这样定义评分函数:
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])]
答案 1 :(得分:3)
def sort_key(item):
name,scores = item
return sum(scores)-max(scores)
print sorted(students,key=sort_key)
你可以轻松地使用一个lambda来实现它,如下所示......我只是为了增加冗长而做了这个
答案 2 :(得分:1)
你可以拒绝sorted(x[1])[:-1]
的最大值,首先对列表和切片进行排序从头到尾:
>>> sorted (l,key=lambda x : sum(sorted(x[1])[:-1]))
[('John', [1, 2, 3, 1, 2, 1]), ('Patrick', [1, 3, 5, 1, 2, 4]), ('Mark', [5, 4, 1, 2, 4, 3])]
回答基准:
>>> s="""l=[("Mark", [5,4,1,2,4,3]), ("John", [1,2,3,1,2,1]), ("Patrick", [1,3,5,1,2,4])]
... sorted (l,key=lambda x : sum(sorted(x[1])[:-1]))"""
>>> timeit.timeit(stmt=s, number=100000)
0.407818078994751
>>> s="""l=[("Mark", [5,4,1,2,4,3]), ("John", [1,2,3,1,2,1]), ("Patrick", [1,3,5,1,2,4])]
... sorted(l, key=lambda x: sum(x[1]) - max(x[1]))"""
>>> timeit.timeit(stmt=s, number=100000)
0.3033828830718994
>>> s="""l=[("Mark", [5,4,1,2,4,3]), ("John", [1,2,3,1,2,1]), ("Patrick", [1,3,5,1,2,4])]
... def sort_key(item):
... name,scores = item
... return sum(scores)-max(scores)
... sorted(l,key=sort_key)"""
>>> timeit.timeit(stmt=s, number=100000)
0.2999439334869385
正如你所看到的,所有答案之间没有太大的区别,Joran Beasley的答案是最好的!