2016-10-04 4 views
2

Ich habe eine Liste (Name = Teppich) von Objekten Typ Mini_Carpet. Mini_carpet enthält eine Liste von Objekten, die als Pakete bezeichnet werden. Pakete hat verschiedene Eigenschaften, die eine interessante für mich ist nr_buys.Python Summen Array von Objekten in Objekte

Was ich tun möchte, ist die Summe der verschiedenen nr_buys, die innerhalb eines Mini_carpet sind, innerhalb eines Teppichs. Dies ist, was ich bisher getan haben:

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

Dies ist mir ein Fehler geben, weil die Liste Indizes müssen ganze Zahlen sein. Irgendwelche Hilfe?

Danke!

+2

'Teppich .__ len__() 'Oh Gott ... Bitte, benutze' len (...) '. – orlp

+0

Ja werde ich danke! – Fabio

Antwort

2

in Python, es Schleife im allgemeinen besser ist, direkt über die Elemente in einer Liste, anstatt Indizes indirekt Looping. Es ist einfacher zu lesen und effizienter, sich nicht mit Indizes herumzuärgern, die Sie nicht wirklich brauchen.

insgesamt Um für jeden mini_carpet Sie dies tun können:

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

ein einziges Gesamtergebnis zu erhalten, eine doppelte for Schleife im Generator Ausdruck tun:

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

Vielen Dank, jetzt weiß ich, wie man richtig Schleife! – Fabio

-1

Wenn Sie die Methode __len__ bereits codiert haben, müssen Sie sie nicht unter carpet.__len__() anrufen. Anstatt len(carpet) zu verwenden.

+2

Einverstanden, aber das beantwortet die Frage nicht. – 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)) 

Sie wollen die indexes eines dict zu bekommen, so verwenden enumerate, die gibt ein tuple: (index, item). Warum verwenden Sie auch dict.__len__?

0

Eine andere Methode, dies zu tun, was ich fühle mich mehr Pythonic ist, ist:

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

Der Unterschied, wie oben erwähnt, ist, dass for x in list in Python Aufruf gibt Ihnen die Elemente der Liste, und nicht ihre Indizes. Das bedeutet, dass der i in Ihrer Antwort nicht der ganzzahlige Index in packages Ihres Artikels ist, sondern Ihr Artikel aus packages selbst, den Sie direkt verwenden können.

Jetzt kann dies von Anfang an erfolgen:

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

(. Frag mich nicht warum Python nutzt diese, um es mich auch verwirrt, aber das ist, wie Listenkomprehensionen arbeiten)

0

Summe der verschiedenennr_buys, die innerhalb eines mini_carpet sind, innerhalb eines Teppichs

Asides WHA Wenn andere gesagt haben, dass Sie versuchen, Ihre Liste mit einem nicht ganzzahligen Objekt zu indizieren, werfen Sie auch das Ergebnis früherer Iterationen weg.

Sie können eine Zuordnung/Wörterbuch verwenden, um diese Ergebnisse zu halten den Teppich Index als Schlüssel, die später verwendet werden können, um das Ergebnis der Summen der nr_buys Werte der Pakete in diesem Teppich zuzugreifen:

nr_total = {} 

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

um die Gesamt nr_buys für alle Teppiche zu bekommen, werden Sie einfach tun:

total = sum(nr_total.values()) 
Verwandte Themen