2016-10-04 114 views
2

我有一個對象類型爲mini_carpet的列表(名稱=地毯)。 Mini_carpet包含一個名爲包的對象列表。 包包含各種屬性,我感興趣的是nr_buys。Python對象數組對象到對象中

我想要做的是總結一個地毯內的mini_carpet內的各種nr_buys。 這是我迄今所做的:

for d in range(0, carpet.__len__() - 1, +1): 
nr_total = sum(carpet[d].packages[i].nr_buys for i in carpet[d].packages) 

這是給我的錯誤,因爲列表索引必須是整數。 有什麼幫助嗎?

謝謝!

+2

'地毯.__ len__ ()'哦,上帝......請使用'len(...)'。 – orlp

+0

是的,我會感謝! – Fabio

回答

2

在Python,這是一般更好地循環,直接在列表中的項目,而不是循環使用間接指標。閱讀起來更容易,而且更高效,不會讓你不需要的索引堆積如山。

一共拿到每個mini_carpet你可以這樣做:

for mini in carpet: 
    nr_total = sum(package.nr_buys for package in mini) 
    # Do something with nr_total 

爲了得到一個單一的總計,做發電機表達的雙重for循環:

nr_total = sum(package.nr_buys for mini in carpet for package in mini) 
+0

非常感謝,現在我知道如何正確循環! – Fabio

-1

當你已經編寫了__len__方法,你不需要通過carpet.__len__()來調用它。而不是使用len(carpet)

+2

同意,但這並不回答這個問題。 – Kevin

0
for d in range(0, len(carpet) - 1, +1): 
nr_total = sum(carpet[d].packages[i].nr_buys for i, _ in enumerate(carpet[d].packages)) 

你想獲得一個dictindexes,所以使用enumerate,它返回一個tuple(index, item)。 另外,你爲什麼使用dict.__len__

0

這樣做,這是我的感覺是更Python的另一種方法是:

nr_total = sum(package.nr_buys for package in carpet[d].packages) 

的差異,如上所述,是在python調用for x in list讓你列表中的項目,而不是他們的指數。這意味着您的答案中的i不是您物品的packages的整數索引,而是您自己的物品packages本身,您可以直接使用它。

nr_total = sum(package.nr_buys for mini_carpet in carpet for package in mini_carpet) 

(不要問我爲什麼Python使用該命令,它混淆了我爲好,但這是列表內涵是如何工作的)

0

現在,這可以從一開始就做

總和是mini_carpet內,地毯之內的各種nr_buys

旁白WHA其他人已經說過試圖用一個非整數對象來索引你的列表,你也拋棄了之前迭代的結果。

您可以使用映射/字典使用地毯指數爲重點,以後可以用來訪問包nr_buys值在地毯和的結果,以保持這些成果:

nr_total = {} 

for i, c in enumerate(carpet): 
    nr_total[i] = sum(package.nr_buys for package in c.packages) 

要獲得總nr_buys所有的地毯,你會簡單地做:

total = sum(nr_total.values())