web-dev-qa-db-fra.com

Utilisation de boucles «while» dans une compréhension de liste

Disons que j'ai une fonction:

x=[]
i=5
while i<=20:
     x.append(i)
     i=i+10
return x

Existe-t-il un moyen de le convertir en une liste de compréhension comme celle-ci?

newList = [i=05 while i<=20 i=i+10]

J'obtiens une erreur de syntaxe.

8
cashmoney11

Vous n'avez pas besoin d'une compréhension de liste pour cela, la gamme ne fera que:

list(range(5, 21, 10)) # [5, 15]

Une boucle while n'est pas possible à l'intérieur d'une compréhension de liste, mais vous pouvez faire quelque chose comme ceci:

def your_while_generator():
    i = 5
    while i <= 20:
        yield i
        i += 10

[i for i in your_while_generator()]
6
Francisco Couzo

Non, vous ne pouvez pas utiliser while dans une liste de compréhension.

D'après la spécification grammaticale de Python , seules les expressions atomiques suivantes sont autorisées:

atom: ('(' [yield_expr|testlist_comp] ')' |    '[' [testlist_comp] ']' |    '{' [dictorsetmaker] '}' |    NAME | NUMBER | STRING+ | '...' | 'None' | 'True' | 'False')

L'expression correspondant à une compréhension de liste - testlist_comp ressemble à ce qui suit dans Python 3:

testlist_comp: (test|star_expr) ( comp_for | (',' (test|star_expr))* [','] )

Ici, les seules déclarations autorisées sont

test: or_test ['if' or_test 'else' test] | lambdef
star_expr: '*' expr
comp_for: [ASYNC] 'for' exprlist 'in' or_test [comp_iter]

comp_if: 'if' test_nocond [comp_iter]
comp_iter: comp_for | comp_if

Aucune instruction while n'est autorisée nulle part. Le seul mot-clé que vous êtes autorisé à utiliser est un for, pour une boucle for.

Solution

Utilisez une boucle for, ou profitez de itertools

4
Akshat Mahajan

Il n'y a pas de syntaxe pour cela, mais vous pouvez utiliser itertools. Par exemple:

In [11]: from itertools import accumulate, repeat, takewhile

In [12]: list(takewhile(lambda x: x <= 20, accumulate(repeat(1), lambda x, _: x + 10)))
Out[12]: [1, 11]

(Ce n'est pas Pythonic cependant, la solution de générateur ou la solution explicite devrait être préférée.)

2
Andy Hayden