[英]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.