我正在尝试编写一个函数来返回任意列表中'False'值的索引。我也想为此使用发电机。
我在下面写道:
def cursor(booleanList):
for element in booleanList:
if element is False:
yield booleanList.index(element)
例如,我有以下列表
testList = [True, False, True, False]
然后:
g = cursor(testList)
但是,如果我使用我的代码,我会得到:
> g.next()
1
> g.next()
1
> g.next()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
StopIteration
我希望得到:
> g.next()
1
> g.next()
3
> g.next()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
StopIteration
代码中的问题在哪里?任何帮助将不胜感激。
答案 0 :(得分:1)
查看.index(x)
的文档,它会返回的值为x
的第一个项目的索引。这解释了为什么您的生成器始终会产生1
。
相反,您可以像这样使用enumerate()
:
def cursor(booleanList):
for index, element in enumerate(booleanList):
if element is False:
yield index
答案 1 :(得分:1)
作为之前答案的扩展,您还可以使用generator expression。不可否认,这是一个更加量身定制的解决方案,但可能适用于您的用例。出于好奇,如果你已经在内存中列出了这个列表,为什么还要使用生成器呢?
testList = [True, False, True, False]
g = (i for i in range(len(testList)) if testList[i] is False)
for i in g:
print i
答案 2 :(得分:0)
这是包含索引[0:True, 1:False, 2:True, 3:False]
的列表,现在booleanList.index
搜索列表中的第一个False
,并返回当然始终为1的索引。
你错误地认为for element in booleanList:
以某种方式耗尽了booleanList
,但事实并非如此。
您需要使用范围for
代替:
def cursor(booleanList):
for index in range(0, len(booleanList):
if booleanList[index] is False:
yield index
testList = [True, False, True, False]
g = cursor(testList)
print g.next()
print g.next()
print g.next()