一个字典,其值为字典:尝试在python中对这些键求和

时间:2009-11-17 23:58:31

标签: python hash dictionary

数据结构是一个字典,每个值都是另一个字典,如:

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

希望Team有一个方法getTotals(self,category),如果你调用了它:

game.home.getTotals('HR')

在这种情况下,该方法会产生:

1104

基本上你可以看到我正在尝试做什么。有什么想法吗?

更新:我有两个列表推导工作,但想把它归结为一个:

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

另一次更新:根据inspectorg4dget下面的有用反馈,我已经知道了。谢谢!

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

最终更新:根据Nadia的反馈,这是另一种方法:

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

3 个答案:

答案 0 :(得分:4)

您可以使用生成器表达式:

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

>>> total('HR')
1104

如果任何字典中缺少类别,我使用dict.get设置默认值为0.

自我版本:

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

答案 1 :(得分:1)

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

答案 2 :(得分: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

有点冗长,但是。请注意作为实例的第一个参数。现在,如果您希望它成为所有团队对象的一部分,则需要修改该类:

lib.schedule.Team.getTotals = myGetTotals

这应该将所述对象添加到类定义中,并使现有对象能够从那里开始使用它。我编写一些Python已经有几个月了,但它应该可以工作。