在列表理解中使用“while”循环

问题描述 投票:0回答:4

假设我有一个函数:

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

有没有办法将其转换为这样的列表理解?

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

我收到语法错误。

python list list-comprehension
4个回答
21
投票

您不需要为此进行列表理解。

range
就可以了:

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

while
循环在列表理解内部是不可能的。相反,你可以这样做:

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

[i for i in your_while_generator()]

19
投票

不,您不能在列表理解中使用

while

根据Python的语法规范,只允许使用以下原子表达式:

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

对应于列表推导式的表达式 -

testlist_comp
在 Python 3 中如下所示:

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

在这里,唯一允许的语句是

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

任何地方都不允许出现任何

while
语句。您唯一可以使用的关键字是
for
,用于 for 循环。

解决方案

使用

for
循环,或利用
itertools



3
投票

没有任何语法,但您可以使用 itertools。例如:

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]

(但这不是Pythonic。应该首选生成器解决方案或显式解决方案。)


0
投票
string = 'abcdefgfhijklmnoprqstuvwxyz123456789'
delimetr = 5
um=[string[i:i+delimetr] for i in range(0,len(string),delimetr)  ]
print(um)  #  ['abcde', 'fgfhi', 'jklmn', 'oprqs', 'tuvwx', 'yz123', '45678', '9']

# bonus: every first 5-th letter
u = list(takewhile(lambda x: lambda i: x[i]<len(string), string[0::delimetr]))
print(u) # ['a', 'f', 'j', 'o', 't', 'y', '4', '9']
© www.soinside.com 2019 - 2024. All rights reserved.