2

私は、イテラブルを取り、センチネル値が連続して 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'

この質問は似ていますが、ジェネレーターの角度が欠けていることに注意してください。

4

3 に答える 3