我有一个包含字符串和None值的列表xs。如何使用列表理解来调用每个字符串上的函数,但将None值转换为“”(而不是将它们传递给函数)?
我尝试了:
[f(x) for x in xs if x is not None else '']
但它给出了SyntaxError。正确的语法是什么?
如果您试图创建一个省略基于条件的值的列表理解,请参阅带条件的列表理解。
如果需要考虑两个以上的条件结果,请注意Python的条件表达式不支持elif。相反,需要嵌套if/else条件。有关详细信息,请参见列表理解条件中的“elif”。
具体的问题已经在前面的答案中解决了,所以我将阐述在列表理解中使用条件的一般思想。
下面是一个例子,说明如何在列表理解中编写条件句:
X = [1.5, 2.3, 4.4, 5.4, 'n', 1.5, 5.1, 'a'] # Original list
# Extract non-strings from X to new list
X_non_str = [el for el in X if not isinstance(el, str)] # When using only 'if', put 'for' in the beginning
# Change all strings in X to 'b', preserve everything else as is
X_str_changed = ['b' if isinstance(el, str) else el for el in X] # When using 'if' and 'else', put 'for' in the end
注意,在X_non_str的第一个列表理解中,顺序是:
可迭代if条件中项的表达式
在X_str_changed的最后一个列表理解中,顺序为:
表达式1 if条件else表达式2 for可迭代项
我总是觉得很难记住表达式1必须在if之前,表达式2必须在else之后。我的头脑希望两者都在之前或之后。
我想它是这样设计的,因为它类似于正常语言,例如“如果下雨,我想呆在里面,否则我想出去”
在普通英语中,上述两种类型的列表理解可以表述为:
仅当:
如果苹果是管道,则在苹果盒中提取苹果
和if/else
如果apple-is_pipe,则标记apple,否则在apple_box中为apple-it_unmark
下面是另一个示例:
>>> print(", ".join(["ha" if i else "Ha" for i in range(3)]) + "!")
Ha, ha, ha!
它利用了这样一个事实,即如果我对0求值为False,对函数range()生成的所有其他值求值为True。因此,列表理解评估如下:
>>> ["ha" if i else "Ha" for i in range(3)]
['Ha', 'ha', 'ha']