2017-10-07 1 views
0

Je voudrais savoir s'il est possible de faire cela avec une compréhension de la liste. La ligne « total = 0 » est ce qui donne l'erreurcompréhension de la liste python avec des boucles et des déclarations

listoflists=[[1,2,5],[1,1,1],[1,2,2,2,1]] 
result=[] 

for lis in listoflists: 
    total = 0 
    for i in lis: 
     if i==1: 
      total+=1 
    result.append(total) 

Tout ce que je peux penser est

result = [total for lis in listoflists total=0 for i in lis if i==1 total +=1] 

Mais bien sûr, ne fonctionne pas, je ne peux pas trouver comment gérer les déclarations qui ne sont pas si ni pour les boucles (dans ce cas, le « total ») dans la liste compréhensions

toute aide serait appréciée

+0

ce n'est pas possible dans une seule liste de compréhension. –

Répondre

0

Il est impossible avec la liste compréhensions tout simplement.

Vous pouvez également utiliser [sum(filter(lambda x: x == 1, l)) for l in listsoflists] si vous pouvez également utiliser quelques fonctions.

EDIT:

[l.count(1) for l in listsoflists] est bien sûr mieux.

1

Vous pouvez simplement faire pour obtenir le nombre total de 1:

result = sum([l.count(1) for l in listoflists]) 

ou si vous avez besoin compte individuels dans les sous-zones, cela devrait faire:

result = [l.count(1) for l in listoflists] 

Ainsi,

listoflists = [[1,2,5],[1,1,1],[1,2,2,2,1]] 
result = sum([l.count(1) for l in listoflists]) # result = 6(1+3+2) 

et:

listoflists = [[1,2,5],[1,1,1],[1,2,2,2,1]] 
result = [l.count(1) for l in listoflists] # result = [1, 3, 2] 
1
> listoflists=[[1,2,5],[1,1,1],[1,2,2,2,1]] 
> [sum([x for x in xs if x == 1]) for xs in listoflists] 
> [1, 3, 2] 
0

Bien que dans ce cas

[l.count(1) for l in listoflists] 

est une réponse efficace.

Conceptuellement pour gérer une agrégation arbitraire (disons différente d'une somme simple) dans votre cas total sur une sous-liste, vous pouvez utiliser reduce.

from functools import reduce 
[reduce(lambda total,x:total + (1 if x==1 else 0),l,0) for l in listoflists]