if/else 在列表理解中

新手上路,请多包涵

如何用空字符串替换所有 None ,然后调用一些函数 f

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

原文由 AP257 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 257
2 个回答

你完全可以做到。这只是一个订购问题:

 [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')

原文由 poke 发布,翻译遵循 CC BY-SA 4.0 许可协议

具体问题已经在以前的答案中得到解决,所以我将解决在列表理解中使用条件的一般想法。

这是一个示例,说明如何在列表理解中编写条件:

 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 的第一个列表理解中,顺序是:

Iterable if 条件 项目 表达式

X_str_changed 的最后一个列表理解中,顺序是:

expression1 if 条件 else expression2 for item in iterable

我总是很难记住 expression1 必须在 if 之前,而 expression2 必须在 else 之后。我的头脑希望两者都在之前或之后。

我猜它是这样设计的,因为它类似于正常语言,例如“ 如果 下雨我想呆在里面, 否则 我想出去”

用简单的英语 来说,上面提到的两种列表推导式可以表述为:

只有 if

_extractapple for _applebox if _apple_isripe _ ___

if/else

_markapple if _apple_isripe else _leave_itunmarked for apple in _applebox

原文由 Tim Skov Jacobsen 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题