3 Stimmen

For-Schleife über mehrere Variablen aus einer einzigen Liste

Ich versuche, eine Schleife wie diese zu erstellen

newList = [a + b for a,b in list[::2], list[1::2]]

d.h. zwei aufeinanderfolgende Einträge aus einer Liste nehmen, etwas mit ihnen machen und sie in eine neue Liste einfügen.

Wie soll das funktionieren?

5voto

intuited Punkte 21798

Sie wollen zip Ihre beiden neu erstellten Listen:

newList = [a + b for a,b in zip(list[::2], list[1::2])]

Sie können dies auch auf eine etwas speichereffizientere Weise tun, indem Sie einen Iterator verwenden:

it = iter(list)
newList = [a + b for a, b in zip(it, it)]

oder noch effizienter* durch die Verwendung der izip Funktion, die einen Iterator zurückgibt:

import itertools
it = iter(list)
newList = [a + b for a, b in itertools.izip(it, it)]

* zumindest unter Python 2.x; in Python 3, wie ich es verstehe, zip selbst gibt einen Iterator zurück.

Hinweis dass Sie niemals eine Variable aufrufen sollten list da dies die eingebaute list Konstrukteur. Dies kann zu verwirrenden Fehlern führen und wird im Allgemeinen als schlechte Form angesehen.

2voto

John La Rooy Punkte 278961
>>> L=range(6)
>>> from operator import add
>>> map(add, L[::2], L[1::2])
[1, 5, 9]

alternativ könnte man hier einen Iterator verwenden

>>> L_iter = iter(L)
>>> map(add, L_iter, L_iter)
[1, 5, 9]

da Sie denselben Iterator zweimal übergeben, map() verbraucht bei jeder Iteration zwei Elemente

Eine andere Möglichkeit, den Iterator zweimal zu übergeben, besteht darin, eine Liste mit einer gemeinsamen Referenz zu erstellen. Das vermeidet die temporäre Variable

>>> map(add, *[iter(L)]*2)
[1, 5, 9]

Natürlich können Sie die add mit Ihrer eigenen Funktion

>>> def myfunc(a,b):
...     print "myfunc called with", a, b
...     return a+b
... 
>>> map(myfunc, *[iter(L)]*2)
myfunc called with 0 1
myfunc called with 2 3
myfunc called with 4 5
[1, 5, 9]

Und es ist einfach, auf 3 oder mehr Variablen zu erweitern

>>> def myfunc(*args):
...     print "myfunc called with", args
...     return sum(args)
... 
>>> map(myfunc, *[iter(L)]*3)
myfunc called with (0, 1, 2)
myfunc called with (3, 4, 5)
[3, 12]

1voto

Mike Punkte 18429

Zip und Map sind hier sehr hilfreich.

>>> a = [1, 2, 3]
>>> b = [4, 5, 6]
>>> list(zip(a, b))
[(1, 4), (2, 5), (3, 6)]
>>> list(map <operation>, (zip(a, b)))
>>> ...

Oder in Ihrem Fall,

>>> list(map(lambda n: n[0] + n[1], (zip(a, b))))
[5, 7, 9]

Es gibt auf jeden Fall eine bessere Möglichkeit, die Plus-Operation an die Karte weiterzugeben. Fühlen Sie sich frei, es zu ergänzen, jeder!

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X