在列表理解中使用while循环

时间:2017-03-09 23:23:45

标签: python list list-comprehension

说我有一个功能:

var searchControl = new L.Control.Search({
layer: Hospitals,
propertyName: 'Hosp_Name',
zoom:14,
hideMarkerOnCollapse:true,
textPlaceholder: "Search Hospital"
});
searchControl.on('search:LocationFound', function(e) {
e.layer.openPopup().openOn(Map);
});
Map.addControl(searchControl);

无论如何将它转换为这样的列表理解?

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

我收到语法错误

3 个答案:

答案 0 :(得分:3)

不,您无法在列表理解中使用while

grammar specification of 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

答案 1 :(得分:2)

你不需要列表理解,范围就是:

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()]

答案 2 :(得分:2)

没有这方面的语法,但您可以使用itertools。例如:

setTimeout( () =>  {                 // fake code
   if  ( eventCounter <= 1234 ) {    
        this();                      // fake code, this() is not a function
   } else {
       console.log('eventCounter is now over 1234');
   }
}, 200);

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