При работе с генераторами, где вам нужен некоторый контекст, я часто использует ниже функцию полезности, чтобы дать скользящий вид окна на итератор:
import collections, itertools
def window(it, winsize, step=1):
"""Sliding window iterator."""
it=iter(it) # Ensure we have an iterator
l=collections.deque(itertools.islice(it, winsize))
while 1: # Continue till StopIteration gets raised.
yield tuple(l)
for i in range(step):
l.append(it.next())
l.popleft()
Он сгенерирует представление последовательности N элементов в точке ime, переместившись на несколько ступеней. например.
>>> list(window([1,2,3,4,5],3))
[(1, 2, 3), (2, 3, 4), (3, 4, 5)]
При использовании в опережающем просмотре/за ситуациями, где вы также должны иметь дело с цифрами, не имея следующее или предыдущее значение, вы можете набивать последовательность с соответствующим значением, например, как None.
l= range(10)
# Print adjacent numbers
for cur, next in window(l + [None] ,2):
if next is None: print "%d is the last number." % cur
else: print "%d is followed by %d" % (cur,next)
Я мог бы сделать «prev, item = item, next» в этом случае. – 2008-11-27 17:31:55
Чтобы сделать этот цикл бесконечно (без StopIteration), сделайте `из цикла импорта itertools` и измените вторую строку на:` iterator = cycle (iterable) ` – 2009-12-17 01:50:04
Разве это меньше Pythonic, чтобы использовать перечисление в этом контексте? – batbrat 2014-02-27 06:40:13