簡體   English   中英

Python:包含元組的排序列表

[英]Python: Sorting list containing 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()丟棄最高的分數,然后對所有剩余分數求和,這給了我分數。 然后,我根據分數得分對其進行排序,但是要求對輸出進行排序,但要使用原始分數而不是分數。 任何想法表示贊賞! 干杯

我們可以定義一個評分函數,如下所示:

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])]
def sort_key(item):
    name,scores = item
    return sum(scores)-max(scores)
print sorted(students,key=sort_key)

您可以使用一個lambda輕松完成此操作,如下所示...我只是為了增加詳細程度而這樣做

您可以通過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的答案都是最好的!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM