下面是我试图转换为列表理解的代码:

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)

当前回答

语法a if b else c在Python中是一个三元运算符,如果条件b为真,则求值为a -否则,求值为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))

其他回答

如果你想要一个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))

语法a if b else c在Python中是一个三元运算符,如果条件b为真,则求值为a -否则,求值为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))

很棒的答案,但只是想提到一个gotcha,“pass”关键字将无法在列表的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

因此,尽量避免在列表推导式中传递

另外,我得出的结论是,列表理解是最有效的方法吗?

也许吧。列表推导本质上计算效率不高。它仍然在线性时间内运行。

从我的个人经验来看: 在处理大型数据集时,我通过将列表推导式(特别是嵌套式)替换为上面的for-loop/list-附加类型结构,大大减少了计算时间。在这个应用程序中,我怀疑您会注意到不同之处。

要在python编程中使用else in列表推导式,您可以尝试下面的代码片段。这将解决您的问题,该代码片段在python 2.7和python 3.5上进行了测试。

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