Getting next element while cycling through a list

前端 未结 12 917
暖寄归人
暖寄归人 2020-12-22 23:48
li = [0, 1, 2, 3]

running = True
while running:
    for elem in li:
        thiselem = elem
        nextelem = li[li.index(elem)+1]

When this reac

相关标签:
12条回答
  • 2020-12-23 00:05

    After thinking this through carefully, I think this is the best way. It lets you step off in the middle easily without using break, which I think is important, and it requires minimal computation, so I think it's the fastest. It also doesn't require that li be a list or tuple. It could be any iterator.

    from itertools import cycle
    
    li = [0, 1, 2, 3]
    
    running = True
    licycle = cycle(li)
    # Prime the pump
    nextelem = next(licycle)
    while running:
        thiselem, nextelem = nextelem, next(licycle)
    

    I'm leaving the other solutions here for posterity.

    All of that fancy iterator stuff has its place, but not here. Use the % operator.

    li = [0, 1, 2, 3]
    
    running = True
    while running:
        for idx, elem in enumerate(li):
            thiselem = elem
            nextelem = li[(idx + 1) % len(li)]
    

    Now, if you intend to infinitely cycle through a list, then just do this:

    li = [0, 1, 2, 3]
    
    running = True
    idx = 0
    while running:
        thiselem = li[idx]
        idx = (idx + 1) % len(li)
        nextelem = li[idx]
    

    I think that's easier to understand than the other solution involving tee, and probably faster too. If you're sure the list won't change size, you can squirrel away a copy of len(li) and use that.

    This also lets you easily step off the ferris wheel in the middle instead of having to wait for the bucket to come down to the bottom again. The other solutions (including yours) require you check running in the middle of the for loop and then break.

    0 讨论(0)
  • 2020-12-23 00:06

    Use the zip method in Python. This function returns a list of tuples, where the i-th tuple contains the i-th element from each of the argument sequences or iterables

        while running:
            for thiselem,nextelem in zip(li, li[1 : ] + li[ : 1]):
                #Do whatever you want with thiselem and nextelem         
    
    0 讨论(0)
  • 2020-12-23 00:07

    I've used enumeration to handle this problem.

    storage = ''
    for num, value in enumerate(result, start=0):
        content = value
        if 'A' == content:
            storage = result[num + 1]
    

    I've used num as Index here, when it finds the correct value it adds up one to the current index of actual list. Which allows me to maneuver to the next index.

    I hope this helps your purpose.

    0 讨论(0)
  • 2020-12-23 00:07

    For strings list from 1(or whatever > 0) until end.

    itens = ['car', 'house', 'moon', 'sun']
    
    v = 0
    for item in itens:
        b = itens[1 + v]
        print(b)
        print('any other command')
        if b == itens[-1]:
            print('End')
            break
        v += 1
    
    0 讨论(0)
  • 2020-12-23 00:10

    You can use a pairwise cyclic iterator:

    from itertools import izip, cycle, tee
    
    def pairwise(seq):
        a, b = tee(seq)
        next(b)
        return izip(a, b)
    
    for elem, next_elem in pairwise(cycle(li)):
        ...
    
    0 讨论(0)
  • 2020-12-23 00:13
    while running:
        for elem,next_elem in zip(li, li[1:]+[li[0]]):
            ...
    
    0 讨论(0)
提交回复
热议问题