def test(lst):
new_lst = []
for i in lst:
if i is True:
new_lst.append(lst.index(i))
return new_lst
以上代码应该做什么:
循环遍历列表中的每个元素,如果元素为True,则将其附加到新列表中。但是,它没有做到它应该做的事情,我无法弄清楚我哪里出错了。
预期:
test([1,2,3,True,True,False])
[3,4]
GOT:
[0,0]
答案 0 :(得分:7)
这不是你的代码返回的内容。您的代码返回[0, 0]
,因为list.index
使用相等语义,而不是标识语义,True == 1
(尝试它)。
对于解决方案,请使用enumerate
:
new_lst = [index for (index, element) in enumerate(lst) if element is True]
的更多信息
答案 1 :(得分:2)
list.index
返回找到第一个匹配的索引。另一个错误是因为list.index
使用了等式语义 - 想象==
符号 - 而True == 1
返回True
。有关详细信息,请参阅@max's answer
使用内置函数enumerate
代替:
for i, v in enumerate(lst):
if v is True:
new_lst.append(i)
答案 2 :(得分:2)
您可以使用enumerate
功能并执行以下操作:
for index, elem in enumerate(lst):
if elem is True:
new_lst.append(index)
您的代码返回[0,0]
。这是有意义的,因为它们在列表中只有两个True
值,但在传递list.index
值时,以某种方式在python True
方法中将返回第一个trueish
值,该值在你的案例将是lis 1
中的第一个元素,因此你得到[0,0]
。
list.index
行为的示例:
>>>l=[1,2,3,True,True,False]
>>>l.index(True)
1 # first trueish value
正如@MaxNoel list.index
测试相等所指出的那样,与True == 1
类似,搜索True
索引时返回索引0。
希望这有帮助!