Hoe loop ik per twee door een lijst?

Ik wil een Python-lijst doorlopen en 2 lijstitems tegelijk verwerken. Zoiets in een andere taal:

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

Wat is de beste manier om dit te bereiken?


Antwoord 1, autoriteit 100%

U kunt gebruiken voor binnen bereik met een stapgrootte van 2:

Python 2

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

Python 3

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

Opmerking:Gebruik xrange in Python 2 in plaats van range omdat het efficiënter is omdat het een itereerbaar object genereert en niet de hele lijst.


Antwoord 2, autoriteit 27%

U kunt ook deze syntaxis gebruiken (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

Waar het eerste cijfer de beginindex is (standaard het begin van de lijst of 0), het tweede cijfer de eindsegmentindex (standaard het einde van de lijst) en het derde cijfer de offset of stap is.


Antwoord 3, autoriteit 16%

De eenvoudigste is naar mijn mening precies dit:

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

Geen extra invoer of iets dergelijks. En naar mijn mening erg elegant.


Antwoord 4, autoriteit 10%

Als je Python 2.6 of nieuwer gebruikt, kun je het grouper receptuit de itertools-module :

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)

Bel als volgt:

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

Merk op dat u in Python 3.x zip_longestmoet gebruiken in plaats van izip_longest.


Antwoord 5, autoriteit 2%

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

Beetje vies, maar het werkt.


Antwoord 6

Dit is misschien niet zo snel als de izip_longest-oplossing (ik heb het niet echt getest), maar het werkt met python < 2.6 (izip_longest is toegevoegd in 2.6):

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)

Als je eerder dan 2.3 moet gaan, kun je de ingebouwde kaart vervangen door imap. Het nadeel is dat het geen mogelijkheid biedt om de vulwaarde aan te passen.


Antwoord 7

Als je controle hebt over de structuur van de lijst, zou het meest pythonische wat je kunt doen waarschijnlijk zijn om het te veranderen van:

l=[1,2,3,4]

naar:

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

Je lus zou dan zijn:

for i,j in l:
    print i, j

Other episodes