63
li = [0, 1, 2, 3]

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

これが最後の要素に到達すると、 anIndexErrorが発生します (反復されるリスト、タプル、辞書、または文字列の場合と同様)。私は実際にその時点でnextelemを等しくしたいと思っていli[0]ます。これに対する私のかなり面倒な解決策は

while running:
    for elem in li:
        thiselem = elem
        nextelem = li[li.index(elem)-len(li)+1]   # negative index

これを行うより良い方法はありますか?

4

12 に答える 12

102

よくよく考えてみると、これが一番いい方法だと思います。を使わなくても簡単に途中抜けできるのbreakが重要だと思いますし、計算量も少ないので最速だと思います。liまた、リストまたはタプルである必要もありません。任意のイテレータである可能性があります。

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)

後世のために、他のソリューションをここに残します。

派手なイテレータのすべてには適切な場所がありますが、ここにはありません。% 演算子を使用します。

li = [0, 1, 2, 3]

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

リストを無限に循環させたい場合は、次のようにします。

li = [0, 1, 2, 3]

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

teeを含む他のソリューションよりも理解しやすく、おそらく高速だと思います。リストのサイズが変わらないことが確実な場合は、リストのコピーを取り出してlen(li)使用できます。

これにより、バケツが再び底に下がるのを待つ必要がなく、途中で観覧車から簡単に降りることができます。他のソリューション(あなたのものを含む)では、ループrunningの途中でチェックインしてから.forbreak

于 2010-01-30T13:17:33.567 に答える
19
while running:
    for elem,next_elem in zip(li, li[1:]+[li[0]]):
        ...
于 2010-01-30T12:35:59.840 に答える
7

ペアワイズ巡回反復子を使用できます。

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)):
    ...
于 2010-01-30T12:37:28.213 に答える
6
while running:
    lenli = len(li)
    for i, elem in enumerate(li):
        thiselem = elem
        nextelem = li[(i+1)%lenli]
于 2010-01-30T13:22:19.837 に答える
5

これを解決するためのかなり異なる方法:

   li = [0,1,2,3]

   for i in range(len(li)):

       if i < len(li)-1:

           # until end is reached
           print 'this', li[i]
           print 'next', li[i+1]

       else:

           # end
           print 'this', li[i]
于 2014-07-15T07:30:33.300 に答える
0
        li = [0, 1, 2, 3]
        for elem in li:
            if (li.index(elem))+1 != len(li):
                thiselem = elem
                nextelem = li[li.index(elem)+1]
                print 'thiselem',thiselem
                print 'nextel',nextelem
            else:
                print 'thiselem',li[li.index(elem)]
                print 'nextel',li[li.index(elem)]
于 2016-09-06T10:57:03.037 に答える