2016-12-17 3 views
2

編集 - キーや値で辞書をソートする方法を説明したが、キーと値の両方にアクセスできるものは見当たらなかった。謝罪もし私が間違っていたら、私は明らかにここで新しいです。誰かが私の投稿に奇妙に思える私の投稿の終わりに感謝を編集しましたが、もし私が私の投稿でそれをするべきでないなら、誰かが私に知らせてくれれば嬉しいですキーの情報を失うことなく辞書を値で並べ替える

私は働いていますファンタジー野球リーグの得点設定をプログラムに入力し、その選手の得点システムの下で獲得する得点とポイントの合計を受け取ることができる個人的なプロジェクトである。ユーザーが入力した設定に基づいて、さまざまなスコアカテゴリと計算されたポイント合計からの合計を含むファイルを読み込む作業を行った。次に、プレーヤーの名前、チーム、位置の文字列をキーとした辞書に情報を追加します。そのポイントの合計は値です。ここで辞書内の最初のいくつかのエントリがあります:私は今から最大まで以上ポイント合計ソート辞書の内容を表示する方法を探しています

{'Rick Porcello, Bos SP': 579.0, 'Chris Sale, CWS SP': 575.0, 'Justin Verlander, Det SP': 601.0, 'Madison Bumgarner, SF SP': 617.0, 'Max Scherzer, Wsh SP': 668.0, 'Johnny Cueto, SF SP': 584.0} 

。例えば、私は上記のようなエントリを表示したいと思います:

'Max Scherzer, Wsh SP': 668.0 
'Madison Bumgarner, SF SP': 617.0 
'Justin Verlander, Det SP': 601.0 
'Johnny Cueto, SF SP': 584.0 
'Rick Porcello, Bos SP': 579.0 
'Chris Sale, CWS SP': 575.0 

私は辞書のためのソート機能を認識してんだけど、それはポイント合計のリストだけで私を残しています。値に基づいてエントリを並べ替えることはできますが、それでもキーにアクセスできるので、どのプレーヤーがXポイントを獲得したのか分かりますか?

さらに、私が望むことを可能にする機能があれば、その機能はどのようにスケールされますか?私はいくつかのエントリだけでは、複雑な複雑さでも機能はうまくいくと思うだろうが、私の完全な辞書には何百人ものプレイヤーがいるだろう。これは単なる個人的なプロジェクトなので、結果を得るために1分待たなければならない場合、それは大きな問題ではありませんが、明らかに速い方が良いです。全体のスピードにかかわらずそうする能力が私の主な関心事なので、私はこの部分にもっと興味があります。

答えて

2

あなたは、キー/値の構造とソート結果を維持したい場合は、私はcollections.OrderedDictをお勧めします。

from collections import OrderedDict 
from operator import itemgetter 

dct = {'Rick Porcello, Bos SP': 579.0, 'Chris Sale, CWS SP': 575.0, 'Justin Verlander, Det SP': 601.0, 'Madison Bumgarner, SF SP': 617.0, 'Max Scherzer, Wsh SP': 668.0, 'Johnny Cueto, SF SP': 584.0} 

OrderedDict(sorted(dct.items(), key=itemgetter(1), reverse=True)) 

key=itemgetter(1)あなたはソート「値」によるとreverse=True降順でソートするsortedを伝えることが規定されています。

これが与える:

OrderedDict([('Max Scherzer, Wsh SP', 668.0), 
      ('Madison Bumgarner, SF SP', 617.0), 
      ('Justin Verlander, Det SP', 601.0), 
      ('Johnny Cueto, SF SP', 584.0), 
      ('Rick Porcello, Bos SP', 579.0), 
      ('Chris Sale, CWS SP', 575.0)]) 

、まだ通常の辞書のようにアクセスすることができます:それは入力にそれをソートすることを考えると

>>> for name, value in odict.items(): 
...  print('{name}: {value}'.format(name=name, value=value)) 
Max Scherzer, Wsh SP: 668.0 
Madison Bumgarner, SF SP: 617.0 
Justin Verlander, Det SP: 601.0 
Johnny Cueto, SF SP: 584.0 
Rick Porcello, Bos SP: 579.0 
Chris Sale, CWS SP: 575.0 

>>> odict['Chris Sale, CWS SP'] 
575.0 

またはそれを反復処理を縮尺はO(n logn)となります。

関連する問題