列表压缩的奇怪行为

22 浏览
0 Comments

列表压缩的奇怪行为

我对列表推导式有一个问题。如果我想输出奇数的平方,并将条件放在输出部分(我知道如何在循环部分放置条件以获得所需的结果),那么

[num**2 if num % 2==0 for num in range(10)]

会返回错误代码。为什么Python不喜欢它?

通过添加else,以下代码返回0

[num**2 if num % 2==0 else 0 for num in range(10)]

所以我试图在此基础上删除0

[num**2 if num % 2==0 else 0 for num in range(10)].remove(0)

然后Python返回一个空列表,为什么?

0
0 Comments

列表推导(list comprehension)的顺序错误。根据Python的数据结构文档中的说明,列表推导的语法规则是:方括号中包含一个表达式,后面跟随一个for子句,然后是零个或多个for或if子句。

首先,我们来看一下问题出现的原因。在给定的例子中,列表推导的顺序是错误的,导致输出结果不符合预期。原始的列表推导写法是:

[num**2 for num in range(10) if num % 2 == 0]

预期的输出结果应该是:[0, 4, 16, 36, 64]。但是实际上得到的输出结果却是:[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]。这是因为在原始的列表推导中,if子句被放置在了for子句之前,导致if条件没有正确地筛选出偶数,而是对所有的数字进行了平方操作。

为了解决这个问题,我们需要将if子句放置在for子句之后。修改后的列表推导写法如下:

[num**2 for num in range(10) if num % 2 == 0]

通过这样的修改,我们可以得到预期的输出结果:[0, 4, 16, 36, 64]。这是因为修改后的列表推导首先通过for子句对范围内的数字进行迭代,然后通过if子句筛选出符合条件的偶数,并对其进行平方操作。

列表推导的顺序错误会导致输出结果不符合预期。为了解决这个问题,我们需要确保列表推导的语法规则中,for子句在if子句之前。通过修改列表推导的顺序,我们可以得到正确的输出结果。

0
0 Comments

Python中的列表推导语法是先写for,然后再写if。所以当我们将if写在for之前时,会返回错误代码。因此,正确的写法应该是:[num**2 for num in range(10) if num % 2 == 0]

另外,我们也可以使用rangestep参数来实现相同的功能:[num**2 for num in range(0, 10, 2)]

这种错误的出现是因为列表推导的语法规则要求先写for再写if,所以我们只需要按照正确的语法顺序来编写代码即可解决这个问题。

0