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]

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:



36

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

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

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


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
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.