Ich habe eine Liste von Booleschen:
[True, True, False, False, False, True]
und ich suche nach einer Möglichkeit, die Anzahl der Vorkommen True
in der Liste zu zählen (im obigen Beispiel möchte ich, dass die Rückgabe erfolgt 3
). Ich habe Beispiele für die Suche nach der Anzahl der Vorkommen bestimmter Elemente gefunden, aber es gibt noch mehr Effizienter Weg, da ich mit Booleanern arbeite? Ich denke an etwas Analoges zu all
oder any
.
Antworten:
True
ist gleich1
.quelle
issubclass(bool, int)
hält in der Tat, so gibt es keinen Zwang.list
hat einecount
Methode:Dies ist tatsächlich effizienter als
sum
und expliziter in Bezug auf die Absicht, sodass es keinen Grund gibt, Folgendes zu verwendensum
:quelle
sum
die andere Antwort nicht verwenden , wenn Sie neben 1 oder True auch andere "wahre" Werte haben. Außerdem erwähnte die Frage nichts anderes alsTrue
oderFalse
.Wenn Sie sich nur mit der Konstante befassen
True
, ist eine einfachesum
in Ordnung. Beachten Sie jedoch, dass in Python auch andere Werte ausgewertet werdenTrue
. Eine robustere Lösung wäre die Verwendung derbool
eingebauten:UPDATE: Hier ist eine weitere ähnlich robuste Lösung, die den Vorteil hat, transparenter zu sein:
PS Python Lappalien:
True
könnte wahr sein , ohne 1. Warnung zu sein: nicht versuchen , diese bei der Arbeit!Viel böser:
quelle
if
Anweisung) komplizierter als nur das Testen aufTrue
. Siehe docs.python.org/py3k/library/stdtypes.html#truth . DasTrue = 2
sollte nur bekräftigen, dass das Konzept von "wahr" komplexer ist; Mit ein wenig zusätzlichem Code (dh mitbool()
) können Sie die Lösung robuster und allgemeiner gestalten.True
undFalse
Schlüsselwörter und Sie können sie nicht ändern.Sie können verwenden
sum()
:quelle
Nur der Vollständigkeit halber (
sum
ist normalerweise vorzuziehen) wollte ich erwähnen, dass wir auch verwenden könnenfilter
, um die wahrheitsgemäßen Werte zu erhalten. Akzeptiert im Normalfallfilter
eine Funktion als erstes Argument, aber wenn Sie sie übergebenNone
, wird nach allen "wahrheitsgemäßen" Werten gefiltert. Diese Funktion ist etwas überraschend, aber gut dokumentiert und funktioniert sowohl in Python 2 als auch in Python 3.Der Unterschied zwischen den Versionen besteht darin, dass in Python 2
filter
eine Liste zurückgegeben wird, sodass wir Folgendes verwenden könnenlen
:In Python 3 wird jedoch
filter
ein Iterator zurückgegeben, sodass wir ihn nicht verwendenlen
können. Wenn wir die Verwendungsum
(aus irgendeinem Grund) vermeiden möchten, müssen wir den Iterator in eine Liste konvertieren (was dies viel weniger hübsch macht):quelle
Nachdem ich alle Antworten und Kommentare zu dieser Frage gelesen hatte, dachte ich an ein kleines Experiment.
Ich erzeugen 50.000 zufällig booleans und genannt
sum
undcount
auf sie.Hier sind meine Ergebnisse:
Nur um sicher zu gehen, habe ich es noch mehrmals wiederholt:
Und wie Sie sehen können,
count
ist dreimal schneller alssum
. Also würde ich vorschlagen,count
wie in zu verwendencount_it
.Python-Version: 3.6.7
CPU-Kerne: 4
RAM-Größe: 16 GB
Betriebssystem: Ubuntu 18.04.1 LTS
quelle
Es ist sicherer,
bool
zuerst durchzulaufen . Dies ist einfach zu bewerkstelligen:Dann fangen Sie alles, was Python als wahr oder falsch ansieht, im entsprechenden Bucket auf:
Wenn Sie es vorziehen, können Sie ein Verständnis verwenden:
quelle
ich bevorzuge
len([b for b in boollist if b is True])
(oder das Äquivalent zum Generatorausdruck), da es ziemlich selbsterklärend ist. Weniger "magisch" als die Antwort von Ignacio Vazquez-Abrams.Alternativ können Sie dies tun, wobei weiterhin davon ausgegangen wird, dass bool in int konvertierbar ist, jedoch keine Annahmen über den Wert von True getroffen werden:
ntrue = sum(boollist) / int(True)
quelle
if b
. Noch wichtiger ist jedoch, dass Sie eine Wegwerfliste erstellen, in der alle Werte gleichzeitig gespeichert werden müssen und die Sie nichtlen
mit einem Generatorausdruck verwenden können. Vermeiden Sie solche Praktiken besser, damit die Lösung skaliert werden kann.if b
ist genau falsch. Es wäre nur richtig, wenn die Frage sich auf Elemente beziehen würde, die als True ausgewertet werden, und nicht auf tatsächliche True-Boolesche Werte. Ich nehme jedoch Ihren zweiten Punkt. In diesem Fall gibt es die Variantesum(1 if b is True else 0 for b in boollist)
.sum(1 for b in boollist if b is True)