web-dev-qa-db-fra.com

is Python liste la compréhension avec accès à l'index / énumérer possible?

considérez ce qui suit Python avec lequel j'ajoute dans une nouvelle liste2 tous les éléments avec des indices de 1 à 3 de liste1:

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

comment écririez-vous ceci en utilisant python liste de compréhension, si je n'ai pas accès aux index par énumération?

quelque chose comme:

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

mais puisque je n'ai pas de numéro 'ind', cela fonctionnerait-il? :

list2 = [x for x in enumerate(list1) if 4>ind>0]
73
Pav Ametvic
list2 = [x for ind, x in enumerate(list1) if 4 > ind > 0]
148
Pavel Anossov

Si vous utilisez enumerate, vous do avez accès à l'index:

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

À moins que votre cas d'utilisation réel ne soit plus compliqué, vous devriez simplement utiliser une tranche de liste comme suggéré par @wim

>>> 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']

Pour les cas plus complexes - si vous n'avez pas réellement besoin de l'index - il est plus facile d'itérer sur une tranche ou une tranche

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

ou

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

Pour les petites tranches, le simple list1[1:4]. Si les tranches peuvent devenir assez volumineuses, il peut être préférable d’utiliser une glissière pour éviter de copier la mémoire.

6
John La Rooy