2010-06-01 89 views
142

这里是我试图变成一个列表理解的代码:是否可以在Python列表理解中使用'else'?

table = '' 
for index in xrange(256): 
    if index in ords_to_keep: 
     table += chr(index) 
    else: 
     table += replace_with 

是有办法else语句添加到这个理解?

table = ''.join(chr(index) for index in xrange(15) if index in ords_to_keep) 

回答

229

语法a if b else c是Python中三元运算符的计算结果为a如果条件b是真实的 - 否则,它的计算结果为c 。它可以理解的语句中使用:

>>> [a if a else 2 for a in [0,1,0,3]] 
[2, 1, 2, 3] 

因此,对于你的榜样,

table = ''.join(chr(index) if index in ords_to_keep else replace_with 
       for index in xrange(15)) 
+9

注意的是Python 2.5,后来这只作品。 – 2010-06-01 22:20:45

+3

真棒!非常有用。 – professorDante 2014-05-05 01:07:17

+6

另请注意,'else'是必需的,不能被忽略,因为总是需要结果值。 – sebix 2014-08-05 08:51:22

14

如果你想要一个else你不想过滤列表理解,你希望它遍历每个值。您可以使用true-value if cond else false-value作为语句来代替,并从末端取下过滤器:

table = ''.join(chr(index) if index in ords_to_keep else replace_with for index in xrange(15)) 
1

而且,我会是正确的结论是列表理解是最有效的方式做到这一点?

也许吧。列表理解本质上不具有计算效率。它仍然在线性运行。

从我个人的经验: 我通过用上面的for-loop/list-appending类型结构替换列表解析(特别是嵌套的)来大量减少计算时间。在这个应用程序中,我怀疑你会注意到一个区别。

+1

woops,我的意思是询问连接方法与字符串上的+ =。 – Josh 2010-06-01 17:54:24

+0

有趣。这(http://wiki.python.org/moin/PythonSpeed#Takeadvantageofinterpreteroptimizations)另有说法。 – kennytm 2010-06-01 17:58:29

+0

@Josh:在老版本的Python中,join()方法非常优越。较新版本的解释器试图优化+ =方法,但我不确定它的工作情况。我几乎总是只使用join()方法。 – 2010-06-01 22:27:40

6

要在Python编程的列表解析中使用else,你可以试试下面的代码片段。这将解决您的问题,该片段在python 2.7和python 3.5上测试。

obj = ["Even" if i%2==0 else "Odd" for i in range(10)] 
0

伟大的答案,但只是想提一个疑难杂症的是“合格”关键字将不在列表中,修真者的if/else部分工作(如张贴在上面提到的例子)。

#works 
list1 = [10, 20, 30, 40, 50] 
newlist2 = [x if x > 30 else x**2 for x in list1 ] 
print(newlist2, type(newlist2)) 

#but this WONT work 
list1 = [10, 20, 30, 40, 50] 
newlist2 = [x if x > 30 else pass for x in list1 ] 
print(newlist2, type(newlist2)) 

这是在Python 3.4上进行了尝试和测试。 错误是如下:

newlist2 = [x if x > 30 else pass for x in list1 ]          
SyntaxError: invalid syntax 

因此,尽量避免在列表内涵通-ES

+0

就列表理解而言,if/else构造只是一个表达式。如果你想离开项目,你需要把你的表达式代替'expr2'在这里'[expr1 for x in list1 if expr2]' – 2017-03-21 00:08:12

+0

Well pass在一个正常if else块中对我有效,这意味着它也可以在其他地方工作。但在列表解析中并非如此。 – Plankton 2017-03-21 03:04:22

+1

但这不是一个正常的if/else块。它是[表达式](https://docs.python.org/3/faq/programming.html#is-there-an-equivalent-of-c-s-ternary-operator)。你也不能在那里使用elif。 – 2017-03-21 20:06:14

相关问题