在布尔值列表中使用列表解析时出现意外结果

She*_*gla 4 python boolean list-comprehension

r=[True, False,True,False, False]
print([i for i in r if str(r[i])=="True"])
Run Code Online (Sandbox Code Playgroud)

此代码给出以下意外结果:[False,False,False]

为什么这是行为?我希望:[True,True]

Jac*_*din 11

i是一个值为True或的布尔值False.如果你将它用作索引r[i],你将获得r[0]或者r[1]因为bool是它的子类int.

你能想象它r[int(i)]int(True) == 1,int(False) == 0.

你的意思是:

print([i for i in range(len(r)) if str(r[i])=="True"])
Run Code Online (Sandbox Code Playgroud)

其中i是整数或:

print([i for i in r if str(i)=="True"])
Run Code Online (Sandbox Code Playgroud)

i布尔值在哪里.

请注意,如果i是布尔值,则没有什么意义if str(i) == "True".更简洁的写作方式是:

print([i for i in r if i])
Run Code Online (Sandbox Code Playgroud)

甚至使用过滤器内置功能:

it = filter(None, r)
print(list(it))
Run Code Online (Sandbox Code Playgroud)

  • *"解释器将r [i]转换为r [int(i)"* - nope.请参阅我的答案的底部. (2认同)