私は、イテラブルを取り、センチネル値が連続して 2 回現れるまで値を通過するイテレータを生成する方法を探しています。iter(a.__next__, sentinel)
センチネルが 2 回出現しなければならないことだけに似ています。
次のかなり平凡なコードがそのトリックを実行しますが、もっと冗長な解決策があるに違いありません。
したがって、具体的な質問に入れると、次のようになります。
本格的なジェネレーターを回避し、おそらくitertools
またはジェネレーター式を使用して同じことを達成する方法はありますか?
>>> def repeat_offenders(a, sentinel):
... ia = iter(a)
... for x in ia:
... if x==sentinel:
... try:
... y = next(ia)
... except StopIteration:
... yield x
... raise
... if y==sentinel:
... raise StopIteration
... yield x
... yield y
... else:
... yield x
以下に 2 つの例を示します。
>>> ''.join(repeat_offenders('ABCABCAABBCC', 'B'))
'ABCABCAA'
>>> ''.join(repeat_offenders('ABABAB', 'B'))
'ABABAB'
この質問は似ていますが、ジェネレーターの角度が欠けていることに注意してください。