Iterate a list as pair (current, next) in Python

前端 未结 10 1663
隐瞒了意图╮
隐瞒了意图╮ 2020-11-21 22:54

I sometimes need to iterate a list in Python looking at the \"current\" element and the \"next\" element. I have, till now, done so with code like:

for curre         


        
相关标签:
10条回答
  • 2020-11-21 23:17

    Here's a relevant example from the itertools module docs:

    import itertools
    def pairwise(iterable):
        "s -> (s0,s1), (s1,s2), (s2, s3), ..."
        a, b = itertools.tee(iterable)
        next(b, None)
        return zip(a, b)   
    

    For Python 2, you need itertools.izip instead of zip:

    import itertools
    def pairwise(iterable):
        "s -> (s0,s1), (s1,s2), (s2, s3), ..."
        a, b = itertools.tee(iterable)
        next(b, None)
        return itertools.izip(a, b)
    

    How this works:

    First, two parallel iterators, a and b are created (the tee() call), both pointing to the first element of the original iterable. The second iterator, b is moved 1 step forward (the next(b, None)) call). At this point a points to s0 and b points to s1. Both a and b can traverse the original iterator independently - the izip function takes the two iterators and makes pairs of the returned elements, advancing both iterators at the same pace.

    One caveat: the tee() function produces two iterators that can advance independently of each other, but it comes at a cost. If one of the iterators advances further than the other, then tee() needs to keep the consumed elements in memory until the second iterator comsumes them too (it cannot 'rewind' the original iterator). Here it doesn't matter because one iterator is only 1 step ahead of the other, but in general it's easy to use a lot of memory this way.

    And since tee() can take an n parameter, this can also be used for more than two parallel iterators:

    def threes(iterator):
        "s -> (s0,s1,s2), (s1,s2,s3), (s2, s3,4), ..."
        a, b, c = itertools.tee(iterator, 3)
        next(b, None)
        next(c, None)
        next(c, None)
        return zip(a, b, c)
    
    0 讨论(0)
  • 2020-11-21 23:19

    I’m just putting this out, I’m very surprised no one has thought of enumerate().

    for (index, thing) in enumerate(the_list):
        if index < len(the_list):
            current, next_ = thing, the_list[index + 1]
            #do something
    
    0 讨论(0)
  • 2020-11-21 23:20

    Roll your own!

    def pairwise(iterable):
        it = iter(iterable)
        a = next(it, None)
    
        for b in it:
            yield (a, b)
            a = b
    
    0 讨论(0)
  • 2020-11-21 23:24
    code = '0016364ee0942aa7cc04a8189ef3'
    # Getting the current and next item
    print  [code[idx]+code[idx+1] for idx in range(len(code)-1)]
    # Getting the pair
    print  [code[idx*2]+code[idx*2+1] for idx in range(len(code)/2)]
    
    0 讨论(0)
提交回复
热议问题