if/else in a list comprehension

2022-09-05 00:56:49

如何将所有s替换为空字符串,然后调用一些函数?Nonef

[f(x) for x in xs if x is not None else '']

答案 1

你完全可以做到这一点。这只是一个排序问题:

[f(x) if x is not None else '' for x in xs]

通常

[f(x) if condition else g(x) for x in sequence]

而且,对于仅具有条件的列表推导,if

[f(x) for x in sequence if condition]

请注意,这实际上使用了一种不同的语言构造,即条件表达式,它本身不是理解语法的一部分,而后面的是列表推导的一部分,用于从源可迭代中筛选元素。iffor…in


条件表达式可用于您希望根据某些条件在两个表达式值之间进行选择的各种情况。这与其他语言中存在的三元运算符?:相同。例如:

value = 123
print(value, 'is', 'even' if value % 2 == 0 else 'odd')

答案 2

在前面的答案中已经解决了具体问题,因此我将讨论在列表推导中使用条件的一般思想。

下面是一个示例,演示如何在列表推导中编写条件语句:

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 如果条件 else 表达式 2 用于迭代

我总是发现很难记住表达式1必须在if之前,而表达式2必须在其他之后。我的头希望两者都在之前或之后。

我想它之所以这样设计,是因为它类似于普通语言,例如“如果下雨,我想呆在里面,否则我想出门”

在简单的英语中,上面提到的两种类型的列表推导可以表示为:

仅:if

如果apple_is_ripe,apple_box 苹果extract_apple

if/else

mark_apple apple_is_ripe leave_it_unmarked 苹果在apple_box