Ist es beim Verständnis der Python-Liste möglich, auf den Elementindex zuzugreifen?

87

Betrachten Sie den folgenden Python-Code, mit dem ich list2alle Elemente mit Indizes von 1 bis 3 von neu hinzufüge list1:

for ind, obj in enumerate(list1):
    if 4 > ind > 0:
        list2.append(obj)

Wie würden Sie dies mit Listenverständnis schreiben, wenn ich durch Aufzählung keinen Zugriff auf die Indizes hätte?

etwas wie:

list2 = [x for x in list1 if 4 > ind > 0]

aber da ich keine indNummer habe, würde das funktionieren?

list2 = [x for x in enumerate(list1) if 4 > ind > 0]
Pav Ametvic
quelle
3
Ich denke , Ihre tatsächliche Nutzung Fall ist komplizierter, aber man konnte einfach sein schneiden list1[1:4]hier
wim
Sie meinen, ich könnte die Liste in das Listenverständnis einteilen? wie : [x for x in list1[1:4]]?
Pav Ametvic
@PavAmetvic, kein @wim bedeutet, dass Sie nur schreiben könnenlist2 = list1[1:4]
John La Rooy

Antworten:

175
list2 = [x for ind, x in enumerate(list1) if 4 > ind > 0]
Pavel Anossov
quelle
36

Wenn Sie enumerate, Sie tun Zugriff auf den Index haben:

list2 = [x for ind, x in enumerate(list1) if 4>ind>0]
BrenBarn
quelle
8

Sofern Ihr tatsächlicher Anwendungsfall nicht komplizierter ist, sollten Sie nur ein Listen-Slice verwenden, wie von @wim vorgeschlagen

>>> list1 = ['zero', 'one', 'two', 'three', 'four', 'five', 'six']
>>> [x for ind, x in enumerate(list1) if 4 > ind > 0]
['one', 'two', 'three']
>>> list1[1:4]
['one', 'two', 'three']

In komplizierteren Fällen - wenn Sie den Index nicht wirklich benötigen - ist es klarer, über ein Slice oder eine Islice zu iterieren

list2 = [x*2 for x in list1[1:4]]

oder

from itertools import islice
list2 = [x*2 for x in islice(list1, 1, 4)]

Für kleine Scheiben ist das einfach list1[1:4]. Wenn die Slices ziemlich groß werden können, ist es möglicherweise besser, eine Islice zu verwenden, um ein Kopieren des Speichers zu vermeiden

John La Rooy
quelle
danke, aber da ich eine Operation für 'x' innerhalb des Verständnisses ausführen möchte (sagen wir x * x), bevor ich es in der neuen Liste speichere, sieht es so aus, als wäre die Verwendung des Slice innerhalb des Listenverständnisses der beste Weg! danke
Pav Ametvic
@PavAmetvic, ok, diese Fälle sind immer noch einfach genug, um keine Aufzählung zu benötigen
John La Rooy