2012-04-14 72 views
4

所以我有這兩個名單:如何索引列表中的3個最高值?

score = [350, 914, 569, 223, 947, 284, 567, 333, 697, 245, 227, 785, 120, 794, 343, 773, 293, 995] 
name = [Ryan, Stacy, Jenna, Peter, Sophie, Bryan, Cole, Andrea, Emily, Blake, Mike, Stephan, Rob, Eliza, Heather, Daniel, Elisabeth, Samantha] 

我必須找到3最高分,並與名單各自的得分手吻合這些分數,這樣我可以有新的列表

top3score = [947, 995, 914] 
top3name = [Sophie, Samantha, Stacy] 

我正在考慮索引最高分數,並將它們附加到列表中,而不是使用索引來將這些分數與名稱進行比較。

我的問題是我如何索引列表中的3個最高值? 然後,如何使用索引在名稱列表中查找得分手名稱,以便我可以將它們追加到top3name列表中?

+3

錯誤的數據結構。你應該使用類似'dict'的東西。 – 2012-04-14 08:24:56

回答

17

我認爲這會做

sorted(zip(score, name), reverse=True)[:3] 

所以,你明白是怎麼回事:

zip:需要iterables,因爲它的參數和需要一個元件與每個迭代,將它們放置在一個元組。

所以:

>>> zip(score, name) 
[(350, 'Ryan'), (914, 'Stacy'), (569, 'Jenna'), (223, 'Peter'), (947, 'Sophie'), (284, 'Bryan'), (567, 'Cole'), (333, 'Andrea'), (697, 'Emily'), (245, 'Blake'), (227, 'Mike'), (785, 'Stephan'), (120, 'Rob'), (794, 'Eliza'), (343, 'Heather'), (773, 'Daniel'), (293, 'Elisabeth'), (995, 'Samantha')] 

sorted:將數據排序。默認情況下,元組元素在0索引中的元素上排序,所以在這種情況下得分。 Reverse = True會先將它降序排列。

最後,[:3]是切片符號,說給我所有的元素從開始到第三個元素。這可能也被寫成[0:3]

+3

加入'reverse = True' – jamylak 2012-04-14 08:22:18

+0

:3:3:3:3:3:3 – 2012-04-14 08:26:46

+0

真棒..我在想heapq,但是這樣更好.. – Mellkor 2012-04-14 08:27:41

13

如果你只對前3名有興趣,有heapq.nlargest

>>> heapq.nlargest(3, zip(score, name)) 
[(995, 'Samantha'), (947, 'Sophie'), (914, 'Stacy')] 

official doc

heapq.nlargest(n, iterable, key=None)

返回由iterable定義的數據集中n個最大元素的列表。鍵,如果提供的話,則指定用於提取從每個元素的比較關鍵的迭代一個參數的函數:key=str.lower等效於:sorted(iterable, key=key, reverse=True)[:n]

性能通知:

後兩個[nlargestnsmallest]對較小的值n表現最佳。對於較大的值,使用sorted()函數會更有效。另外,當n==1時,使用內置的min()max()函數更有效率。

相關問題