2012-04-14 4 views
4

ので、私は、これらの2つのリストを持っている:リスト内の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] 

私は新しいリスト

top3score = [947, 995, 914] 
top3name = [Sophie, Samantha, Stacy] 
を持つことができるように、3点の最高得点を見つけ、名前のリストで、それぞれの得点でこれらのスコアを集計する必要があります

私は、これらのスコアを名前で集計するためにインデックスを使用するよりも、最高のスコアをインデックスに追加し、リストに追加することを考えています。

私の質問はどのように私はリストの3つの最高値のインデックスを作成するのですか? 次に、インデックスを使用して名前リストにscorersの名前を検索し、top3nameリストに追加できるようにするにはどうすればよいですか?

zip

+3

データ構造が正しくありません。 'dict'のようなものを使うべきです。 –

答えて

17

私は、これはそれを

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

を行いますので、あなたは何が起こっているかを理解すると思う、それは引数だとして反復可能オブジェクトを取り、タプルに置く、各反復可能な1つの要素を取ります。だから、

>>> 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]は、最初から3番目の要素まですべての要素を与えるというスライス表記です。また、これはあなたがトップ3にのみ興味があるなら、heapq.nlargestがあります[0:3]

+3

'reverse = True'に追加 – jamylak

+0

:3:3:3:3:3:3 –

+0

私はヒープのラインで考えていましたが、これは良い方法です。 – Mellkor

13

のように書くこともできます

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

official docから:

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

iterableで定義されたデータセットからn個の最大要素を含むリストを返します。 sorted(iterable, key=key, reverse=True)[:n]

パフォーマンス予告:相当key=str.lower:キーは、提供されている場合、反復可能な内の各要素から比較キーを抽出するために使用される1つの引数の関数を指定

後者の2つは、nという小さな値の場合に最適です。値が大きい場合は、sorted()関数を使用する方が効率的です。また、n==1の場合は、組み込みのmin()max()の関数を使用する方が効率的です。

関連する問題