En la comprensión de la lista de Python, ¿es posible acceder al índice de elementos?

91

Considere el siguiente código de Python con el que agrego en un nuevo list2todos los elementos con índices del 1 al 3 de list1:

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

¿Cómo escribiría esto usando la comprensión de listas, si no tengo acceso a los índices a través de enumerate?

algo como:

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

pero como no tengo indnúmero, ¿funcionaría esto?

list2 = [x for x in enumerate(list1) if 4 > ind > 0]
Pav Ametvic
fuente
3
Supongo que su caso de uso real es más complejo, pero podría simplemente estar cortando list1[1:4]aquí
wim
¿Quiere decir que podría dividir la lista dentro de la lista de comprensión? como [x for x in list1[1:4]]:?
Pav Ametvic
@PavAmetvic, no @wim significa que solo puedes escribirlist2 = list1[1:4]
John La Rooy

Respuestas:

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

Si se utiliza enumerate, se haga tener acceso al índice:

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

A menos que su caso de uso real sea más complicado, solo debe usar un segmento de lista como lo sugiere @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']

Para casos más complicados, si realmente no necesita el índice, es más claro iterar sobre un segmento o un segmento.

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

o

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

Para rodajas pequeñas, lo simple list1[1:4]. Si los cortes pueden volverse bastante grandes, puede ser mejor usar un corte para evitar copiar la memoria.

John La Rooy
fuente
gracias, pero como quiero realizar una operación en 'x' dentro de la comprensión (digamos x * x) antes de almacenarla dentro de la nueva lista, ¡parece que usar el segmento dentro de la lista de comprensión es la mejor manera! gracias
Pav Ametvic
@PavAmetvic, ok, esos casos todavía son lo suficientemente simples como para no necesitar enumeración
John La Rooy