2009-11-17 2 views
1

structure de données est un dictionnaire, chaque valeur est un autre dictionnaire, comme:Un dictionnaire avec des valeurs qui sont des dictionnaires: essayer de résumer dans ces clés en python

>>> from lib import schedule 
>>> schedule = schedule.Schedule() 
>>> game = schedule.games[0] 
>>> game.home 
<lib.schedule.Team instance at 0x9d97c6c> 
>>> game.home.lineup 
{'guerv001': {'HR': 392, '1B': 1297}, 'kendh001': {'HR': 12, '1B': 201}, 'andeg001': {'HR': 272, '1B': 1572}, 'mattg002': {'HR': 104, '1B': 632}, 'figgc001': {'HR': 26, '1B': 672}, 'iztum001': {'HR': 16, '1B': 253}, 'huntt001': {'HR': 213, '1B': 834}, 'quinr002': {'HR': 23, '1B': 200}, 'napom001': {'HR': 46, '1B': 96}} 

Voudrait équipe d'avoir une getTotals méthode (auto , catégorie) où, si vous avez appelé:

game.home.getTotals('HR') 

La méthode serait, dans ce cas, le rendement:

1104 

Essentiellement, vous pouvez voir ce que j'essaie de faire. Des idées?

mise à jour: Je cette travaille avec deux compréhensions de liste mais je voudrais vanner il à un seul:

def getTotals(self, category): 
    cats = [x for x in self.lineup.values()] 
    return sum([x[category] for x in cats]) 

une autre mise à jour: Sur la base des commentaires utiles de inspectorg4dget ci-dessous, je suis devenu il. Merci!

def getTotals(self, category): 
    return sum(self.lineup[man][category] for man in self.lineup.keys()) 

mise à jour finale: D'après les commentaires de Nadia, voici une autre approche:

+2

Est-ce un problème de devoirs? –

+0

Envisageriez-vous d'ajouter une balise 'dictionary' à cette question afin qu'elle soit facile à trouver dans le futur? Merci. – behindthefall

Répondre

4

Vous pouvez utiliser une expression du générateur:

def total(category): 
    return sum(value.get(category, 0) for value in game.home.lineup.values()) 

>>> total('HR') 
1104 

je dict.get pour faire la par défaut 0 si la catégorie est manquante dans un dictionnaire.

La version auto:

def total(self, category): 
    return sum(value.get(category, 0) for value in self.lineup.values()) 
+0

J'ai changé cela pour en faire un membre de classe de Team mais il jette une exception 'Too many values ​​to unpack' lorsqu'il est implémenté comme ceci: return somme (value.get (category, 0) pour key, value in self.lineup – Wells

+0

Veuillez réessayer svp maintenant. Je l'ai corrigé. –

+0

Fonctionne aussi bien! Je vous remercie. – Wells

1
def total(category): 
    return sum([ghl[man][category] for man in game.home.lineup.keys()]) 
+0

return somme (man [category] pour l'homme dans self.lineup.keys()) TypeError: les index de chaîne doivent être des entiers, pas str – Wells

+0

Désolé pour le mauvais code. Il a été changé maintenant et testé contre votre cas de test. Ça marche. Le problème était avec des ['] mal placés, ce qui était une faute de frappe.C'est du temps avant les finales, ce qui explique pourquoi la qualité de mon code n'est pas optimale. Désolé encore – inspectorG4dget

0
def myGetTotals(self, team): 
    count = 0 
    for aKey in self.lineup: 
     if team in self.lineup[aKey]: 
      count = count + self.lineup[aKey][team] 
    return count 

Type de verbeux, mais meh. Faites attention au premier paramètre qui est l'instance. Maintenant, si vous voulez faire partie de tous les objets de l'équipe, vous aurez besoin de modifier la classe:

lib.schedule.Team.getTotals = myGetTotals 

Cela devrait ajouter cet objet à la définition de classe et faire des objets existants capables de l'utiliser à partir de là avant. Cela fait quelques mois que j'ai codé du Python, mais ça devrait marcher.

+0

Code bizarre. Est-ce que 'team in self.lineup' ne serait pas une constante sur toute la fonction? Si c'est le cas, c'est la même chose: 'return sum (self.lineup [aKey] [équipe] pour aKey dans self.lineup) si team dans self.lineup else 0' ou même' return sum (quelque chose [team] pour quelque chose dans self.lineup.values ​​()) si l'équipe dans self.lineup else 0' – hughdbrown

+0

Ouais, j'ai fait un booboo dans ma course, qui est réparé maintenant (merci!). 'si l'équipe dans self.lineup [aKey]:' est la ligne appropriée. De toute façon, d'autres personnes avaient déjà posté les bonnes réponses au moment où j'ai posté, donc mon objectif était principalement d'avoir quelque chose à utiliser avec le deuxième bloc de code qui n'avait pas encore été abordé. – Stigma

Questions connexes