webentwicklung-frage-antwort-db.com.de

Wie kann ich eine Liste zu zweit durchlaufen?

Mögliches Duplikat:
Was ist die „pythonischste“ Methode, um eine Liste in Blöcken zu durchlaufen?

Ich möchte eine Python Liste durchlaufen und 2 Listenelemente gleichzeitig verarbeiten. So etwas in einer anderen Sprache:

for(int i = 0; i < list.length(); i+=2)
{
   // do something with list[i] and list[i + 1]
}

Was ist der beste Weg, um dies zu erreichen?

221
froadie

Sie können für in range mit einer Schrittgröße von 2 Folgendes verwenden:

Python 2

for i in xrange(0,10,2):
  print(i)

Python

for i in range(0,10,2):
  print(i)

Hinweis: Verwenden Sie xrange in Python 2 anstelle von range, da es effizienter ist, da es ein iterierbares Objekt und nicht die gesamte Liste generiert.

331
Brian R. Bondy

Sie können diese Syntax auch verwenden (L[start:stop:step]):

mylist = [1,2,3,4,5,6,7,8,9,10]
for i in mylist[::2]:
    print i,
# prints 1 3 5 7 9

for i in mylist[1::2]:
    print i,
# prints 2 4 6 8 10

Wobei die erste Stelle der Startindex ist (standardmäßig der Anfang der Liste oder 0), die zweite Stelle der End-Slice-Index (standardmäßig das Ende der Liste) und die dritte Stelle der Versatz oder der Schritt.

79
jathanism

Das Einfachste ist meiner Meinung nach genau das:

it = iter([1,2,3,4,5,6])
for x, y in Zip(it, it):
    print x, y

Keine zusätzlichen Importe oder ähnliches. Und meiner Meinung nach sehr elegant.

43
carl

Wenn Sie Python 2.6 oder neuer verwenden, können Sie den Zackenbarsch Rezept aus dem itertools Modul:

from itertools import izip_longest

def grouper(n, iterable, fillvalue=None):
    "grouper(3, 'ABCDEFG', 'x') --> ABC DEF Gxx"
    args = [iter(iterable)] * n
    return izip_longest(fillvalue=fillvalue, *args)

Rufen Sie wie folgt an:

for item1, item2 in grouper(2, l):
    # Do something with item1 and item2

Beachten Sie, dass Sie in Python 3.x Zip_longest Anstelle von izip_longest Verwenden sollten.

41
Mark Byers
nums = range(10)
for i in range(0, len(nums)-1, 2):
    print nums[i]

Ein bisschen schmutzig, aber es funktioniert.

5
Ishpeck

Dies ist möglicherweise nicht so schnell wie die izip_longest-Lösung (ich habe sie nicht getestet), aber sie funktioniert mit python <2.6 (izip_longest wurde in 2.6 hinzugefügt):

from itertools import imap

def grouper(n, iterable):
    "grouper(3, 'ABCDEFG') --> ('A,'B','C'), ('D','E','F'), ('G',None,None)"
    args = [iter(iterable)] * n

    return imap(None, *args)

Wenn Sie älter als 2.3 sein müssen, können Sie imap durch die integrierte Karte ersetzen. Der Nachteil ist, dass der Füllwert nicht angepasst werden kann.

2
lambacck

Wenn Sie die Kontrolle über die Struktur der Liste haben, ist es wahrscheinlich das Pythonischste, sie zu ändern von:

l=[1,2,3,4]

zu:

l=[(1,2),(3,4)]

Dann wäre Ihre Schleife:

for i,j in l:
    print i, j
0
Jorenko