2017-02-02 8 views
0

python noobここに。だから私はURLからJSONファイルを取得し、情報を解析してデータベースに入れるプログラムを作っています。 JSONはうまく機能していますが、今は固執しています。コードで説明します。Python get ordered dictからキーを取得

playerDict = { 
      "zenyatta" : 0, 
      "mei" : 0, 
      "tracer" : 0, 
      "soldier76" : 0, 
      "ana" : 0, 
      ...} 

これは私が各ヒーローの選手データを入力するオリジナルの辞書です。

topHeroes = sorted(playerDict.items(),key = operator.itemgetter(1),reverse = True) 

このリストを並べ替えると、最も多く再生されたヒーローが最初に再生されます。

topHeroesDict = topHeroes[0:3] 
playerDict['tophero'] = topHeroesDict[0] 

次に、トップ3のヒーローを取得します。 2行目は、ここにそうようにリストを出力します:

'secondhero': ('mercy', 6.0) 

私は出力になりたいのに対し:

'secondhero': 'mercy' 

は私がして、リストせずに以下のコードを試してみましたが、任意のヘルプをお願い申し上げます。

list(topHeroes.keys())[0] 

コードの量について事前にお詫び申し上げます。

答えて

1

"firsthero"の代わりに "top 1"と指定した場合など、列挙型でアプローチすることができます。列挙を使用すると、リストを反復して、現在のインデックスを追跡することができます。このインデックスは、この辞書の理解の中でキーに名前を付けるために使用されます。 j [0]は、タプルの最初の要素であるヒーローの名前です。あなたはこれを達成するために、任意の輸入を必要としない

topHeroes = sorted(playerDict.items(),key = operator.itemgetter(1),reverse = True) 
top = {0: "first", 1: "second", 2: "third"} 
topHeroesDict = {top[i]+"hero": j[0] for i, j in enumerate(topHeroes[0:3])} 

topHeroes = sorted(playerDict.items(),key = operator.itemgetter(1),reverse = True) 
topHeroesDict = {"Top "+str(i): j[0] for i, j in enumerate(topHeroes[0:3])} 

また、あなたが最初にこのようなインデックスをマッピングした辞書を使用することができます。 itemgetterがなければ、次のように1行で入力することができます:

top = {0: "first", 1: "second", 2: "third"} 
topHeroesDict = {top[i]+"hero": j[0] for i, j in enumerate(sorted([(i, playerDict[i]) for i in playerDict.keys()], key = lambda x: x[1], reverse = True)[0:3])} 
+0

ありがとうございました!これは動作します! – Marzipan

1

あなたは辞書のitemsメソッドによって返されるタプルの反復可能なをソートしているので、ソートされたリストの各項目は、主人公とそのスコアを含むタプルです。

あなたは完全にsorteddict.itemsを使用して避け、単にcollections.Counterを使用して、most_common 3英雄を取得することにより、(自分のスコアなし)をリードする英雄を得ることができます。

from collections import Counter 


player_dict = Counter(playerDict) 
leading_heroes = [hero for hero, _ in player_dict.most_common(3)] 
+0

このカウンタは本当に便利です!ありがとう! – Marzipan

関連する問題