列表压缩的奇怪行为
列表压缩的奇怪行为
我对列表推导式有一个问题。如果我想输出奇数的平方,并将条件放在输出部分(我知道如何在循环部分放置条件以获得所需的结果),那么
[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返回一个空列表,为什么?
列表推导(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子句之前。通过修改列表推导的顺序,我们可以得到正确的输出结果。