2009-12-11 11 views
0

J'écris actuellement un programme en Python pour suivre les statistiques sur les jeux vidéo. Un exemple du dictionnaire que je utilise pour suivre les scores:Comment faire pour trier les tableaux dans le dictionnaire?

ten = 1 
sec = 9 
fir = 10 
thi5 = 6 
sec5 = 8 

games = { 
     'adom': [ten+fir+sec+sec5, "Ancient Domain of Mysteries"], 
     'nethack': [fir+fir+fir+sec+thi5, "Nethack"] 
     } 

En ce moment, je vais sur ce à la dure, et de faire une grande liste des ifs imbriquées, mais je ne pense pas C'est la bonne façon de s'y prendre. J'essayais de trouver un moyen de trier le dictionnaire, via les tableaux, puis de trouver un moyen d'afficher les dix premiers qui apparaissent ... au lieu de travailler en profondeur dans les instructions if. Donc, en gros, ma question est la suivante: avez-vous des idées que je pourrais utiliser pour rendre cela plus facile, au lieu de wayyyy, beaucoup plus difficile?

===== ==== EDIT

les dix + sapin produit des nombres. Je veux trouver un moyen de trier les listes (je n'ai pas la connaissance de la terminologie appropriée) pour aller au nombre (en principe, ceux qui ont le nombre le plus élevé dans la première partie du tableau passent en premier.)

un exemple de ma façon actuelle d'aller à ce sujet (cependant, il est incomplet, parce qu'elle est très fatiguant: Example Nests (paste2) (nous allons essayer celui-ci)

DEUXIÈME ==== ==== EDIT

En? cas quelqu'un ne voit pas mon commentaire ci-dessous:

dix, sapin, et cetera - ce ne sont que des variables pour les scores. d'une liste des dix premiers en un nombre variable. dix = 1, nin = 2, sapin = 10, fir5 = 10, sec5 = 8, sec = 9 ... ainsi: 'adom': [dix + sapin + sec + sec5, "Ancien domaine des mystères" ] registres fait que: 'adom': [1 + 10 + 9 + 8 "ancien domaine des Mystères"], qui finit par ressembler à:

'adom': [28, « Domain Ancient des Mystères "]

donc, au fond, si je fini par faire le « top deux » de mon exemple, ce serait:

((1)) Nethack (48)

((2)) ADOM (28)

J'écrirait un nombre réel, mais je pense à changer quelques choses, alors les chiffres pourraient être différents, et je ne voudrais pas le réécrire.

TROISIÈME == (ET FINALE SI TOUT VA) EDIT ==

fixe mon exemple de code d'origine.

+1

"Arrays"? Voulez-vous dire "listes"? Veuillez mettre à jour la question. –

+0

Je ne sais pas comment les dix + sapins + sec + sec5 se rapportent aux noms de variables dans votre exemple de code, mais quelque chose que vous serez probablement heureux de savoir: si vous appelez simplement 'sort (array)' où tous les éléments de 'array' sont des listes ou des tuples en soi, le tri les ordonnera automatiquement d'abord par le premier élément de la liste/du tuple, ensuite par le second, etc. – Wim

+0

Mettez à jour votre exemple pour montrer la structure actuelle. Est-ce que «dix + sapin» un numéro ou une liste de nombres? De même, vous n'avez pas besoin de \ car votre instruction a '{}' s. –

Répondre

3

Que diriez-vous quelque chose comme ceci:

scores = games.items() 
scores.sort(key = lambda key, value: value[0]) 
return scores[:10] 

Ceci renvoie les 10 premiers, triés par le premier élément du tableau. Je ne suis pas sûr si c'est ce que vous voulez cependant, s'il vous plaît mettre à jour la question (et corriger le lien de l'exemple) si vous avez besoin d'autre chose ...

2
import heapq 

return heapq.nlargest(10, games.iteritems(), key=lambda k, v: v[0]) 

est le moyen le plus direct pour obtenir les dix paires clé/valeur, triées par le premier élément de chaque liste « valeur ». Si vous pouvez définir plus précisément quelle sortie vous voulez (juste les noms, les paires nom/valeur, ou quoi d'autre?) Et le critère de tri, c'est facile à ajuster, bien sûr.

0

La solution de Wim est bonne, mais je dirais que vous devriez probablement aller plus loin et pousser ce travail sur une base de données, plutôt que de dépendre de Python. Python s'interface bien avec la plupart des types de bases de données, où une grande partie de ce que vous explorez est déjà un problème résolu. Par exemple, au lieu de vous soucier de déplacer vos dictionnaires vers d'autres types de données afin de les trier correctement, vous pouvez simplement trier toutes les données pour chaque entrée pertinente en fonction des critères de votre requête. Il y a un besoin de tri compliqué et de recours juste là. Bien que les dictionnaires soient tentants à utiliser, car ils donnent l'illusion d'avoir des capacités de type base de données pour accéder à des données basées sur ses attributs, je pense toujours qu'ils trébuchent pas mal en termes d'implémentation. Je n'ai pas vraiment de chiffres à vous donner, mais juste de l'expérience personnelle, tout ce que vous faites sur Python quand il s'agit de manipuler de grandes quantités de données, vous pouvez faire beaucoup plus vite et plus efficace en code et calcul avec quelque chose comme MySQL Je ne suis pas sûr de ce que vous avez prévu en ce qui concerne la structure de vos données, mais avec l'ajout de données, changer la structure est beaucoup plus facile en utilisant une base de données, aussi.

+0

Définir ** large ** ;-) Jusqu'à quelques centaines d'éléments, je suppose que les performances seront très similaires avec une implémentation Python uniquement, tout en vous épargnant beaucoup de headackes d'installation. Tout dépend (tm) de beaucoup de conditions environnementales que nous ne connaissons pas ... – Wim

+1

-1: En désaccord. Python a de nombreux avantages sur les bases de données. Les dictionnaires Python, les listes et la fonction 'sorted' le feront bien sans ajouter la complexité de SQL. Une base de données aide lorsque les données doivent avoir un accès simultané. Sinon, les structures Python fonctionnent à merveille pour toute base de données qui correspond à la mémoire. –

+0

Les bases de données engagent beaucoup de frais généraux. – recursive