2009-11-17 193 views
1

數據結構是一個字典,每一值是另一個字典,如:與是字典值的字典:試圖跨這些密鑰來總結在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}} 

想隊有一種方法getTotals(自其中,如果你叫,類別):

game.home.getTotals('HR') 

的方法會,在這種情況下,收益率:

1104 

基本上,你可以看到我想要做什麼。有任何想法嗎?

更新:我這有兩個list解析工作,但想簸它歸結爲一個:

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的反饋,這裏的另一種方法:

+2

這是一個功課問題嗎? – 2009-11-18 00:01:22

+0

你會考慮爲這個問題添加一個'詞典'標籤,以便將來很容易找到?謝謝。 – behindthefall 2009-11-18 01:20:25

回答

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()) 
+0

我改變了它,使它成爲團隊的一個班級成員,但它在執行時拋出'太多值解包'異常,如下所示: 返回sum(value.get(category,0)for key,value in self.lineup ) – Wells 2009-11-18 00:11:16

+0

請現在再試一次。我修好了它。 – 2009-11-18 00:14:53

+0

也適用!謝謝。 – Wells 2009-11-18 00:18:18

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

返回sum(man [category]爲self.lineup.keys()中的男子) TypeError:字符串索引必須是整數,而不是str – Wells 2009-11-18 00:13:32

+0

對不起,關於錯誤代碼。它現在已經改變並且針對您的測試案例進行了測試。有用。問題在於錯誤的'[]',這是一個錯字。這是決賽前的測試時間,這就是爲什麼我的代碼質量不是最好的原因。對不起 – inspectorG4dget 2009-11-18 01:33:18

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以來已經過去了幾個月,但它應該可行。

+0

怪異的代碼。 'self.lineup'不會在整個函數中成爲一個常量嗎?如果是這樣的話,就和這樣:'self.lineup else 0'或者甚至'return sum(某事物[團隊])的return sum(self.lineup [aKey] [team] self.lineup中的aKey)在self.lineup.values())如果團隊self.lineup其他0' – hughdbrown 2009-11-18 03:37:36

+0

是的,我做了一個booboo在我的倉促,現在是固定的(謝謝!)。 '如果self.lineup [aKey]中的球隊:'是合適的線路。無論哪種方式,其他人在我發佈的時候已經發布了正確的答案,所以我的重點主要集中在讓第二塊代碼尚未解決的問題上使用。 – Stigma 2009-11-18 09:45:26