我正在寻找一种方法来生成一个迭代器,该迭代器接受一个可迭代的并只传递值,直到一个标记值直接连续出现两次。类似于iter(a.__next__, sentinel)
只有哨兵必须出现两次。
以下相当平淡无奇的代码可以解决问题,但肯定有一个不那么冗长的解决方案吗?
所以把它放在一个具体的问题上:
有没有办法避免使用成熟的生成器并使用可能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
这里有两个例子:
>>> ''.join(repeat_offenders('ABCABCAABBCC', 'B'))
'ABCABCAA'
>>> ''.join(repeat_offenders('ABABAB', 'B'))
'ABABAB'
请注意,此问题类似,但缺少发电机角度。