2016-04-22 5 views
1

私は任意のリストに 'False'値のインデックスを返す関数を作成しようとしています。私はこのために発電機を使いたいと思っています。Python 2.7xジェネレータがブールリストの "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

あなたが本当に必要としているのはおそらく 'enumerate'でしょう。 – user2357112

+0

'[indのためのind、値のない列挙(testList)の値]' – styvane

答えて

1

.index(x)のドキュメントを参照すると、値xの最初の項目のインデックスが返されます。これはあなたの発電機が常に1を生み出している理由を説明します。

代わりに、あなたはこのようなenumerate()を使用することがあります。

def cursor(booleanList): 
    for index, element in enumerate(booleanList): 
    if element is False: 
     yield index 
+0

'要素ではない:yield index'を使用する必要があります – styvane

+0

@ user3100115これはおそらく著者が' 0'を生成したくない。 – Delgan

+0

いいえ、リスト内の要素の型は 'bool'です。 – styvane

0

これは、現在のインデックス[0:True, 1:False, 2:True, 3:False]リストの最初のFalseためbooleanList.index検索であなたのリストであり、もちろん常に1

であるインデックスを返します。

どういうわけか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() 
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 
関連する問題