2017-02-02 4 views
0

Python noob hier. Also mache ich ein Programm, das eine JSON-Datei von einer URL abliest und die Informationen analysiert und in eine Datenbank legt. Ich habe das JSON funktioniert, zum Glück, aber jetzt bin ich fest, ich werde es durch meinen Code erklären.Python bekommen Schlüssel von geordneten dict

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

Also das ist mein Originalwörterbuch mit dem ich dann mit den Spielern Daten für jeden Helden fülle.

Ich sortiere dann diese Liste und es dreht sich die Helden mit der meisten Stunden zuerst gespielt.

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

Ich bekomme dann die Top drei Helden. Die zweite Zeile hier druckt eine Liste wie folgt:

'secondhero': ('mercy', 6.0) 

Während ich die Ausgabe sein will: jede Hilfe

'secondhero': 'mercy' 

schätzen würde ich den Code versucht haben, unten mit und ohne Liste.

list(topHeroes.keys())[0] 

Also danke im Voraus und Entschuldigung für die Menge an Code!

Antwort

1

Sie könnten einen Ansatz mit enumerate nehmen, wenn statt "firsthero" Sie sind ok mit "Top 1" und so weiter. Mit enumerate können Sie über die Liste iterieren und den aktuellen Index verfolgen, der verwendet wird, um den Schlüssel in diesem Wörterbuchverständnis zu benennen. j [0] ist der Name des Helden, der das erste Element des Tupels ist.

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

Alternativ können Sie ein Wörterbuch verwenden, die den Index abbildet zuerst wie folgt aus:

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])} 

Sie brauchen keine Importe um dies zu erreichen. Ohne itemgetter, können Sie es in einer Zeile wie folgt tun:

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

Vielen Dank! Das funktioniert! – Marzipan

1

Sie Sortierung ein iterable von Tupeln durch die items Methode des dict zurückgegeben, so dass jedes Element in der sortierten Liste ist ein Tupel die Helden und ihre Partitur enthält.

Sie einfach mit collections.Counter und dann bekommt die most_common 3 Helden mit sorted und dict.items zusammen und erhalten die führenden Helden (ohne ein Tor) vermeiden.

from collections import Counter 


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

Der Zähler ist wirklich nützlich! Dank dafür! – Marzipan

Verwandte Themen