Python 2.7x生成器在布尔列表中返回“False”的索引

时间:2016-04-22 23:44:58

标签: python python-2.7 generator

我正在尝试编写一个函数来返回任意列表中'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

代码中的问题在哪里?任何帮助将不胜感激。

3 个答案:

答案 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()