Iterate over a ‘window’ of adjacent elements in Python

前端 未结 5 1605
情话喂你
情话喂你 2020-12-15 08:33

This is more a question of elegance and performance rather than “how to do at all”, so I\'ll just show the code:

def iterate_adjacencies(gen, fill=0, size=2,         


        
5条回答
  •  天涯浪人
    2020-12-15 09:01

    I'm surprised nobody took a simple coroutine approach.

    from collections import deque
    
    
    def window(n, initial_data=None):
        if initial_data:
            win = deque(initial_data, n)
        else:
            win = deque(((yield) for _ in range(n)), n)
        while 1:
            side, val = (yield win)
            if side == 'left':
                win.appendleft(val)
            else:
                win.append(val)
    
    win = window(4)
    win.next()
    
    print(win.send(('left', 1)))
    print(win.send(('left', 2)))
    print(win.send(('left', 3)))
    print(win.send(('left', 4)))
    print(win.send(('right', 5)))
    
    ## -- Results of print statements --
    deque([1, None, None, None], maxlen=4)
    deque([2, 1, None, None], maxlen=4)
    deque([3, 2, 1, None], maxlen=4)
    deque([4, 3, 2, 1], maxlen=4)
    deque([3, 2, 1, 5], maxlen=4)
    

提交回复
热议问题