파이썬 목록 이해에서 항목 색인에 액세스 할 수 있습니까?


91

다음 중 list21에서 3까지의 인덱스가있는 모든 항목을 새로 추가하는 다음 Python 코드를 고려하십시오 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]]?
Pav Ametvic 2013

@PavAmetvic, 그냥 쓸 수없는 @wim 수단list2 = list1[1:4]
존 라 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']

더 복잡한 경우-실제로 인덱스가 필요하지 않은 경우-슬라이스 또는 islice를 반복하는 것이 더 명확합니다.

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'에 대한 작업을 수행하고 싶기 때문에 목록 이해력 내부의 슬라이스를 사용하는 것이 가장 좋은 방법 인 것 같습니다! 감사합니다
Pav Ametvic 2013

@PavAmetvic는 확인 이러한 경우는 필요가 없다 열거 여전히 간단한 충분
존 라 Rooy
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.