В понимании списка Python можно ли получить доступ к индексу элемента?

91

Рассмотрим следующий код Python, с помощью которого я добавляю list2все элементы с индексами от 1 до 3 из list1:

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

Как бы вы написали это, используя понимание списка, если бы у меня нет доступа к индексам через enumerate?

что-то типа:

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

но поскольку у меня нет indномера, будет ли это работать?

list2 = [x for x in enumerate(list1) if 4 > ind > 0]
Пав Аметвич
источник
3
Я предполагаю, что ваш реальный вариант использования более сложен, но вы могли бы просто разрезать list1[1:4]здесь
wim
вы имеете в виду, как будто я могу разрезать список внутри понимания списка? как [x for x in list1[1:4]]:?
Пав Аметвич,
@PavAmetvic, нет @wim означает, что вы можете просто писатьlist2 = list1[1:4]
Джон Ла Рой,

Ответы:

183
list2 = [x for ind, x in enumerate(list1) if 4 > ind > 0]
Павел Аносов
источник
37

Если вы используете enumerate, вы делаете иметь доступ к индексу:

list2 = [x for ind, x in enumerate(list1) if 4>ind>0]
BrenBarn
источник
10

Если ваш реальный вариант использования не является более сложным, вам следует просто использовать фрагмент списка, как предлагает @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']

В более сложных случаях - если вам действительно не нужен индекс - проще перебирать фрагмент или фрагмент.

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

или

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

Для маленьких кусочков самое простое list1[1:4]. Если срезы могут стать довольно большими, лучше использовать islice, чтобы избежать копирования памяти.

Джон Ла Рой
источник
спасибо, но поскольку я хочу выполнить операцию с 'x' внутри понимания (скажем, x * x), прежде чем я сохраню его в новом списке, похоже, что использование фрагмента внутри понимания списка - лучший способ! спасибо
Пав Аметвич
@PavAmetvic, хорошо, эти случаи все еще достаточно просты, чтобы не нуждаться в перечислении
Джон Ла Рой,