是的,else 可以在 Python 中使用 list comprehension 和 Conditional Expression(“三元运算符”):
>>> [("A" if b=="e" else "c") for b in "comprehension"]
['c', 'c', 'c', 'c', 'c', 'A', 'c', 'A', 'c', 'c', 'c', 'c', 'c']
这里的括号“()”只是为了强调条件表达式,不一定是必须的(Operator precedence)。
另外,多个表达式可以嵌套,导致更多elses和更难阅读代码:
>>> ["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']
条件s?是的,多个ifs 是可能的,实际上也是多个fors:
>>> [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 中的有效变量名 (identifier),此处仅用于显示它实际上并未使用。它有一个 special meaning in interactive mode)
可以将它用于附加条件表达式,但没有实际用途:
>>> [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,即else 和if 也可以在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'}
Generator Expressions 也使用相同的语法:
>>> for g in ("a" if b else "c" for b in "generator"):
... print(g, end="")
...
aaaaaaaaa>>>
可用于创建tuple (there is no tuple comprehension)。
进一步阅读: