2017-08-17 1 views

Répondre

1

Vous pourriez faire un sum sur une expression conditionnelle du générateur qui ne nécessite pas de listes intermédiaires ou des opérations arithmétiques inutiles:

>>> sum(1 for element in MyVar if element != 0) 
1 

ou comme l'a souligné @ Jean-François Fabre:

>>> sum(1 for element in MyVar if element) 
1 

Si le MyVarne contient des nombres cela compte le nombre de valeurs non nulles.

+1

ou 'sum (1 pour élément dans MyVar if élément)' –

+1

Il y a une différence subtile entre "non zéro "et" est véridique "- et la question a demandé" pas zéro ". Dans ce cas, les deux donneraient le même résultat mais ils ne le seraient pas si la liste contenait des valeurs étranges comme des chaînes vides/tuples/dicts/lists. – MSeifert

+0

bien sûr, je connais le bit de vérité ... –

2

Vous pouvez essayer:

>>> len(filter(lambda x: x != 0, MyVar)) 
1 
+1

ne fonctionne pas dans python 3. Vous n'avez pas besoin de passer un argument pour filtrer. Il suffit de passer 'None' BTW .:' len (liste (filtre (None, MyVar))) ' –

+0

@ Jean-FrançoisFabre bonne chose il n'y a pas un tag python3 sur cette question :) – gobrewers14

+1

pour moi maintenant les réponses devraient être python 3 conforme, sauf indication contraire. Python 2 est l'histoire. –

1

Essayez avec filter():

>>> my_var = [0, 0, 0, 0, 1, 0, 0, 0, 0] 
>>> result = filter(lambda x: x > 0, my_var) 
[1] 
>>> print(len(result)) 
1 
3

obtenir la longueur de la sous-liste de tous les éléments qui ne sont pas 0

MyVar = [0,0,0,0,1,0,0,0,0] 
len([x for x in MyVar if x != 0]) 
>> 1 
+3

Probablement pas une bonne idée d'utiliser 'is' ou' is not' pour comparer des valeurs. C'est juste un détail d'implémentation que '0' est une constante et c'est seulement une constante dans CPython. '! =' serait mieux – MSeifert

9

Pas besoin de générer listes, juste:

len(MyVar) - MyVar.count(0) 
0

Pas presque aussi efficace que l'une des réponses ci-dessus, mais simple et direct néanmoins

myVar = [0,0,0,0,1,0,0,0,0] 
count = 0 

for var in myVar: 
    if var != 0: 
     count += 1 
2

Les éléments suivants doivent travailler:

>>> MyVar = [0,0,0,0,1,0,0,0,0] 
>>> sum(map(bool, MyVar)) 
1 

Il convertit la liste à une liste de booléens , avec la valeur True ssi un élément est différent de zéro. Ensuite, il va résumer tous les éléments en considérant implicitement True ayant une valeur 1 et False ayant une valeur 0.

+0

'sum (MyVar)' fait aussi l'affaire! –

+0

cela pour 'MyVar = [0,0,0,0,1,0,0,0 , 3] 'retournera' 1 + 3 = 4' – JuniorCompressor

+0

true L'exemple OP n'est pas représentatif, comme toujours :) –

0

Avec reduce de functools:

from functools import reduce 

reduce((lambda x, y: x + (y>0)), MyVar, 0) 
0
f = sum([1 for x in MyVar if x!= 0]) 

Une ligne :)

+0

devrait-il être x pour x dans MyVar? – AK47

+2

pourquoi? Je fais une somme – PYA

+1

Eh bien, ce n'est pas moi qui ai voté - mais j'ai juste deviné pourquoi vous l'avez reçu. – AK47

0

En utilisant somme de iterator:

sum(x != 0 for x in MyVar)