Wenn Sie die Größe des Speichers reduzieren möchten, können Sie vermeiden, indem Sie einen Generator eine temporäre Liste zu erzeugen:
sum(x > 0 for x in frequencies)
Dies funktioniert, weil bool
eine Unterklasse von int
ist:
>>> isinstance(True,int)
True
und True
's Wert ist 1:
>>> True==1
True
Wie Joe Golton in den Kommentaren betont, ist diese Lösung jedoch nicht sehr schnell. Wenn Sie über genügend Speicher verfügen, um eine temporäre Zwischenliste zu verwenden, ist sth's solution möglicherweise schneller. Hier vergleichen einige Timings verschiedene Lösungen:
>>> frequencies = [random.randint(0,2) for i in range(10**5)]
>>> %timeit len([x for x in frequencies if x > 0]) # sth
100 loops, best of 3: 3.93 ms per loop
>>> %timeit sum([1 for x in frequencies if x > 0])
100 loops, best of 3: 4.45 ms per loop
>>> %timeit sum(1 for x in frequencies if x > 0)
100 loops, best of 3: 6.17 ms per loop
>>> %timeit sum(x > 0 for x in frequencies)
100 loops, best of 3: 8.57 ms per loop
Beachten Sie, dass timeit Ergebnisse je nach Version von Python, OS oder Hardware variieren.
Natürlich, wenn Sie Mathe auf einer großen Liste von Zahlen tun, sollten Sie wahrscheinlich NumPy werden:
>>> frequencies = np.random.randint(3, size=10**5)
>>> %timeit (frequencies > 0).sum()
1000 loops, best of 3: 669 us per loop
Das NumPy Array weniger Speicher als die entsprechende Python-Liste erfordert, und die Berechnung kann sein viel schneller als jede reine Python-Lösung.
Zählen von Null verschiedenen Elemente ist nicht das gleiche wie Zählelemente> 0. Der Titel sollte entsprechend geändert werden – joaquin
Ich habe den Titel Ihrer Frage so aktualisiert, dass sie den Inhalt wiedergibt. Ich hoffe es geht dir gut. – EOL