是的,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数据结构教程
列表理解
集
字典