"count" in verschachtelten Listen?

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
pyrosch
User
Beiträge: 4
Registriert: Mittwoch 9. März 2011, 10:15

Hallo,

ich finde keine einfache Lösung, um die Anzahl von Elementen in verschachtelten Listen zu finden.

Bsp:

Code: Alles auswählen

liste = [[1,100],[2,101],[3,100],[4,100]]
Wie oft kommen die Elemente 100 und 101 vor?

Vielen Dank im Vorraus für eure Antworten.

lg.
deets

Na, denk doch mal nach. Wie machst du es denn fuer nicht-verschachtelte Listen? Und was muss du machen, wenn du mehrere Listen hast? Dann bist du doch schon da...
Benutzeravatar
snafu
User
Beiträge: 6738
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Du könntest den "sum()-Trick" anwenden:

Code: Alles auswählen

>>> sum(liste, []).count(100)
3
Ich weiß aber nicht, ob dieses Verhalten von sum() garantiert ist. Auf der sicheren Seite wäre man vermutlich mit itertools.chain.from_iterable(), wobei man da noch explizit in eine Liste umwandlen müsste, um count() nutzen zu können.
pyrosch
User
Beiträge: 4
Registriert: Mittwoch 9. März 2011, 10:15

@snafu, danke schon mal für die Idee!
snafu hat geschrieben:...ob dieses Verhalten von sum() garantiert ist
Wie meinst Du das? Was könnte passieren, wenn man es so macht?
lunar

@pyrosch: "sum()" konkateniert die Unterlisten mithilfe des "+"-Operators. Dieses Verhalten ist schon garantiert, nur ist die Lösung trotzdem nicht gut. Es wird eben aufgrund der Konkatenation für jede Unterliste eine neue Kopie erzeugt, so dass die Lösung folglich quadratische Komplexität hat.

Halte Dich also besser an den Rat von deets.
Benutzeravatar
snafu
User
Beiträge: 6738
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Naja, was ich jetzt meinte war, dass sum() sich ja auch beschwert, wenn man auf diesem Weg Strings "zusammenzählen" will. Es könnte ja sein, dass in irgendeinem entfernten Python dies auch bei anderen Typen verboten wird. So oder so ist, wie schon gesagt wurde, sum() im Prinzip nicht für sowas gedacht.
bords0
User
Beiträge: 234
Registriert: Mittwoch 4. Juli 2007, 20:40

ungetestet:

Code: Alles auswählen

sum(a.count(100) for a in liste)
oder auch

Code: Alles auswählen

sum(collections.Counter(a) for a in liste)
Antworten