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

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)

当前回答

是的,else可以在Python中使用条件表达式(“三元运算符”)的列表理解式中使用:

>>> [("A" if b=="e" else "c") for b in "comprehension"]
['c', 'c', 'c', 'c', 'c', 'A', 'c', 'A', 'c', 'c', 'c', 'c', 'c']

在这里,括号“()”只是强调条件表达式,它们不一定是必需的(操作符优先级)。

此外,一些表达式可以嵌套,导致更多的else和更难阅读的代码:

>>> ["A" if b=="e" else "d" if True else "x" for b in "comprehension"]
['d', 'd', 'd', 'd', 'd', 'A', 'd', 'A', 'd', 'd', 'd', 'd', 'd']
>>>

在相关的注意事项中,一个理解式也可以在结尾包含它自己的if条件:

>>> ["A" if b=="e" else "c" for b in "comprehension" if False]
[]
>>> ["A" if b=="e" else "c" for b in "comprehension" if "comprehension".index(b)%2]
['c', 'c', 'A', 'A', 'c', 'c']

条件?是的,可能有多个“如果”,实际上也可能有多个“如果”:

>>> [i for i in range(3) for _ in range(3)]
[0, 0, 0, 1, 1, 1, 2, 2, 2]
>>> [i for i in range(3) if i for _ in range(3) if _ if True if True]
[1, 1, 2, 2]

(单个下划线_在Python中是一个有效的变量名(标识符),这里使用它只是为了表明它实际上没有被使用。在交互模式下有特殊的意义)

使用this作为附加的条件表达式是可能的,但没有实际用处:

>>> [i for i in range(3)]
[0, 1, 2]
>>> [i for i in range(3) if i]
[1, 2]
>>> [i for i in range(3) if (True if i else False)]
[1, 2]

推导式也可以嵌套以创建“多维”列表(“数组”):

>>> [[i for j in range(i)] for i in range(3)]
[[], [1], [2, 2]]

最后但并非最不重要的是,一个推导式并不局限于创建一个列表,即else和if也可以以同样的方式在set推导式中使用:

>>> {i for i in "set comprehension"}
{'o', 'p', 'm', 'n', 'c', 'r', 'i', 't', 'h', 'e', 's', ' '}

还有一个字典理解:

>>> {k:v for k,v in [("key","value"), ("dict","comprehension")]}
{'key': 'value', 'dict': 'comprehension'}

生成器表达式也使用相同的语法:

>>> for g in ("a" if b else "c" for b in "generator"):
...     print(g, end="")
...
aaaaaaaaa>>>

可以用来创建一个元组(没有元组理解)。

进一步阅读:

Python数据结构教程 列表理解 集 字典

其他回答

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

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

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

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

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

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

很棒的答案,但只是想提到一个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

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

语法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))