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.