У розумінні списку Python чи можна отримати доступ до індексу елементів?


90

Розглянемо наступний код Python, за допомогою якого я додаю до нового list2всі елементи з індексами від 1 до 3 з list1:

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

Як би ви написали це, використовуючи розуміння списку, якщо я не маю доступу до індексів через перерахування?

щось на зразок:

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, no @wim означає, що ти можеш просто писатиlist2 = list1[1:4]
John La Rooy

Відповіді:



37

Якщо ви використовуєте enumerate, ви робите мати доступ до індексу:

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

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, добре, ці справи все ще досить прості, щоб не потребувати перерахування
John La Rooy
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.