Python列表理解中的意外零替换

2024-04-26 23:16:08 发布

您现在位置:Python中文网/ 问答频道 /正文

我在看一个stackoverflow问题(if else in a list comprehension),决定试试下面这行

[ a if a else "Exception" for a in range(10) ]

得到以下清单

[ "Exception", 1, 2, 3, 4, 5, 6, 7, 8, 9 ]

作为输出。我原以为结果会很好

[ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 ]

因为零就是它自己,就像其他数字被计算一样。为了测试这种行为是否只影响第一个指标,我试着

[ a if a else "Exception" for a in range( 1, 10 ) ]

输出

[ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 ]

如果行为是特定于第一个索引的,我就不会想到这一点。考虑到目前为止的结果,我尝试了以下想法0在iterable中有一些特别的东西。你知道吗

[ a if a else "Exception" for a in [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ] ]

以及

import numpy [ a if a else "Exception" for a in numpy.zeros(10) ]

这两起案件的结果如下

[ "Exception", "Exception", "Exception", "Exception", "Exception", "Exception", "Exception", "Exception", "Exception", "Exception" ]

如果有人能向我解释这种行为,我将不胜感激。似乎0在iterable中可能会触发意外行为,但我对这个结论没有信心。你知道吗


Tags: inimportnumpyforifexceptionzerosrange
3条回答

0是被视为False的数值类型之一,与[] Empty List和许多其他类型相同,因此在列表压缩中的表达式中,0是导致Exception字符串结果的False条件

您可以使用IDLE进行检查:

>>> bool(0)
False
>>> bool(1)
True
>>> bool([])
False
>>> bool([1,2])
True

这是因为在python中0的计算结果是False。所有其他数字的计算结果都是True,因此被放在列表中。你知道吗

我们来看看这个。你知道吗

[ a if a else "Exception" for a in range(10) ]

range(10)计算结果为0,1,2,3,4,5,6,7,8,9

0->;False

所有其他数字->;True

Python将0视为false,将任何其他数字视为true。你知道吗

自己试试:

if 0: print("0 is false")
if 1: print("1 is true")
if 2: print("2 is true")

您得到的输出是:

1 is true

2 is true

列表压缩的意思是:

对于0到9之间的每个数字,如果a为真,则将a添加到列表中;如果a为假,则将“例外”添加到列表中

因为0被视为False,所以0会得到“Exception”,然后1 2 3。。。其他号码都是这样。你知道吗

相关问题 更多 >