微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

列表推导式中的条件为什么当我使用“else”时会有所不同?

如何解决列表推导式中的条件为什么当我使用“else”时会有所不同?

代码 A:

numbers = [2,-1,79,33,-45]
negative_doubled = [num * 2 for num in numbers if num < 0]
print(negative_doubled) # output is: [-2,-90]

代码 B:

numbers = [2,-45]
doubled = [num * 2 if num < 0 else num * 3 for num in numbers ]
print(doubled) # output is: [6,-2,237,99,-90]

如您所见,if 语句的位置不同。在代码 A 中,if 语句位于 for 循环语句之后。

他们为什么不写这样的代码?我会觉得它更直观。

numbers = [2,-45]
negative_doubled = [num * 2 if num < 0 for num in numbers] # SyntaxError
print(negative_doubled) 

(如您所知,此展示位置存在语法错误。)

有没有可能出现问题的情况?

解决方法

您可以认为 Python 中的推导式始终遵循以下通用格式:

[expression for iter_var in sequence if some_condition]

除非为 some_condition 提供明确的布尔表达式,否则假定为真。

expression 可以是 Python 中的任何有效表达式,包括遵循以下格式的三元表达式

x = val if cond else other_val

相当于

if cond:
    x = val
else:
    x = other_val

一种理解是一个简单的过滤器,[x for x in seq if cond]。另一个是三元表达式[x if cond else y for _ in seq]

过滤理解的示例:

>>> [x for x in range(10) if x % 2 == 0]
[0,2,4,6,8]

相当于

res = []
for x in range(10):
    if x % 2 == 0:
        res.append(x)

这是一个三元理解的例子:

>>> [x**2 if x % 2 == 0 else x**3 for x in range(10)]
[0,1,27,16,125,36,343,64,729]

相当于

res = []
for x in range(10):
    res.append(x**2 if x % 2 == 0 else x**3)

以下是两者结合的示例:

>>> lst = [1,"a","b",3,"2",6]
>>> [x**2 if x % 2 == 0 else x**3 for x in lst if isinstance(x,int)]
[1,36]

相当于

res = []
for x in range(10):
    if isinstance(x,int):
        res.append(x**2 if x % 2 == 0 else x**3)

TL;DR

您可以将推导理解为实际上具有单一的统一结构:

[expression for iter_var in sequence if some_condition]

expression 可以是任何东西,甚至是一个包含 ifelse 关键字的三元表达式,但实际上与 some_condition 无关,所有理解是谓词。

我不知道,我喝醉了,我觉得我解释得不好,也不想再尝试了。

,
numbers = [2,-1,79,33,-45]
negative_doubled = [num * 2 if num < 0 else num for num in numbers] # SyntaxError
print(negative_doubled) 

如果 num >= 0,你需要告诉你的机器发生了什么。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?