是否可以使用'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)
187127 次浏览

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

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

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

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

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

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

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

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

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

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

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

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

>>> ["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']

Condition<年代trong>年代吗?是的,可以有多个__abc0,实际上也可以有多个__abc1:

>>> [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]]

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

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

dictionary理解:

>>> {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>>>

它可以用来创建tuple (没有元组理解)。

人力资源/ > < p > < 进一步阅读:< / p >