Python:包含元组的排序列表

时间:2014-12-08 19:04:13

标签: python list sorting tuples

我还在学习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()丢弃最高分,然后我将所有剩余分数排除,这给了我分数。然后我根据标记得分对其进行排序,但输出需要进行排序,但是使用原始标记,而不是标记得分。 任何想法赞赏!干杯

3 个答案:

答案 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的答案是最好的!