Dans la compréhension de liste Python, est-il possible d'accéder à l'index des éléments?

91

Considérez le code Python suivant avec lequel j'ajoute dans un nouveau list2tous les éléments avec des indices de 1 à 3 sur list1:

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

Comment écririez-vous cela en utilisant la compréhension de liste, si je n'ai pas accès aux index via enumerate?

quelque chose comme:

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

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

list2 = [x for x in enumerate(list1) if 4 > ind > 0]
Pav Ametvic
la source
3
Je suppose que votre cas d'utilisation réel est plus complexe, mais vous pourriez simplement trancher list1[1:4]ici
wim
tu veux dire que je pourrais découper la liste dans la compréhension de la liste comme [x for x in list1[1:4]]:?
Pav Ametvic
@PavAmetvic, pas de @wim signifie que vous pouvez simplement écrirelist2 = list1[1:4]
John La Rooy

Réponses:

183
list2 = [x for ind, x in enumerate(list1) if 4 > ind > 0]
Pavel Anossov
la source
37

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

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

À moins que votre cas d'utilisation réel ne soit plus compliqué, vous devez 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 compliqués - si vous n'avez pas réellement besoin de l'index - il est plus clair d'itérer sur une tranche ou une islice

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 grandes, il peut être préférable d'utiliser une islice pour éviter de copier la mémoire

John La Rooy
la source
merci mais puisque je veux effectuer une opération sur 'x' à l'intérieur de la compréhension (disons x * x) avant de la stocker dans la nouvelle liste, il semble que l'utilisation de la tranche à l'intérieur de la liste de compréhension est la meilleure façon! merci
Pav Ametvic
@PavAmetvic, ok ces cas sont encore assez simples pour ne pas nécessiter d'énumération
John La Rooy