129 votes

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

Considérons le code Python suivant avec lequel j'ajoute un nouveau fichier list2 tous les éléments avec des indices de 1 à 3 de list1 :

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

Comment écrivez-vous ceci en utilisant la compréhension de liste, si je n'ai pas accès aux indices par le biais de enumerate ?

quelque chose comme :

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

mais comme je n'ai pas ind numéro, est-ce que ça marcherait ?

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

233voto

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

45voto

BrenBarn Points 63718

Si vous utilisez enumerate vous faire ont accès à l'index :

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

12voto

gnibbler Points 103484

À moins que votre cas d'utilisation réel soit plus compliqué, vous devriez simplement utiliser une tranche de liste comme le suggère @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 un 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 un islice pour éviter de copier la mémoire.

3voto

bluebinary Points 181

Pour ceux qui se posent la question, vous pouvez tout aussi bien stocker les indices correspondants comme résultat de la compréhension de la liste si votre cas d'utilisation l'exige. Il se peut que vous deviez évaluer la valeur de chaque élément de la liste pour déterminer s'il correspond à une valeur ou à un motif, et que vous souhaitiez simplement obtenir une liste des indices correspondants pour un traitement ultérieur plutôt que les valeurs correspondantes.

Cela peut être fait comme indiqué ci-dessous :

>>> values = ['zero', 'one', 'two', 'three', 'four', 'five', 'six']
>>> search = ['one', 'three', 'five']
>>> matches = [i for i, x in enumerate(values) if x in search]
>>> print(matches)
[1, 3, 5]

La partie importante ci-dessus est l'utilisation de l'option [i for i, x in enumerate(l) if ...] dans la liste de compréhension, où l'indice i est capturée plutôt que la valeur x qui serait obtenue en utilisant la méthode plus typique de [x for x in l if ...] ou l'alternative [x for i, x in enumerate(l) if ...] les modèles de compréhension de la liste d'énumération.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X