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]

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:



37

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

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

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


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
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.