Словарь со значениями, которые являются словарями: пытается суммировать по этим ключам в python - PullRequest
1 голос
/ 18 ноября 2009

Структура данных - это словарь, каждое значение - это другой словарь, например:

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

Хотел бы, чтобы у команды был метод 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 ]

4 голосов
/ 18 ноября 2009

Вы можете использовать выражение генератора:

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 голос
/ 18 ноября 2009
def total(category):
    return sum([ghl[man][category] for man in game.home.lineup.keys()])
0 голосов
/ 18 ноября 2009
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, но он должен работать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...