답변:
다른 답변은 시퀀스에서만 작동합니다.
반복 가능한 경우 첫 번째 항목을 건너 뛰십시오.
itercars = iter(cars)
next(itercars)
for car in itercars:
# do work
마지막을 건너 뛰려면 다음을 수행하십시오.
itercars = iter(cars)
# add 'next(itercars)' here if you also want to skip the first
prev = next(itercars)
for car in itercars:
# do work on 'prev' not 'car'
# at end of loop:
prev = car
# now you can do whatever you want to do to the last one on 'prev'
파이썬에서 첫 번째 요소를 건너 뛰려면 간단히 쓸 수 있습니다.
for car in cars[1:]:
# Do What Ever you want
또는 마지막 요소를 건너 뛰려면
for car in cars[:-1]:
# Do What Ever you want
이 개념을 모든 시퀀스에 사용할 수 있습니다.
첫 번째 항목을 건너 뛰는 가장 좋은 방법은 다음과 같습니다.
from itertools import islice
for car in islice(cars, 1, None):
# do something
이 경우 islice는 반복기의 끝을 나타내는 시작점 1과 끝점 없음으로 호출됩니다.
iterable의 끝에서 항목을 건너 뛸 수 있으려면 길이를 알아야합니다 (항상 목록에 대해서는 가능하지만 반복 할 수있는 모든 것은 아님). 예를 들어 islice (cars, 1, len (cars) -1)는 자동차 목록의 첫 번째 항목과 마지막 항목을 건너 뜁니다.
islice
길이를 알거나 절대적으로 필요한 것보다 더 많은 항목을 메모리에 저장하지 않고 반복 사용의 시작 및 / 또는 끝에서 임의의 수의 항목을 건너 뛰는 것을 다룹니다 .
islice
에 전달되는 것입니다 deque
아닌 전체 반복자, 그리고 마지막에 건너 뛸 항목의 수의 길이입니다. 전체 반복자를 메모리에 저장하지 않습니다.
다음은 iterable의 시작과 끝에서 여러 항목을 건너 뛰는 일반적인 생성기 함수입니다.
def skip(iterable, at_start=0, at_end=0):
it = iter(iterable)
for x in itertools.islice(it, at_start):
pass
queue = collections.deque(itertools.islice(it, at_end))
for x in it:
queue.append(x)
yield queue.popleft()
사용법 예 :
>>> list(skip(range(10), at_start=2, at_end=2))
[2, 3, 4, 5, 6, 7]
at_end == 0
.
skip(xrange(10000000), 1)
는을 사용 at_end=0
하므로 매개 변수 deque()
는 islice(it, 0)
입니다 it
. 이것은 많은 메모리를 차지하지 않습니다.
for item in do_not_use_list_as_a_name[1:-1]:
#...do whatever
list
변수 이름으로 사용하지 마십시오
list
은 리 바인드 될 수 있습니다. 그렇기 때문에 사용할 수없는 것이 아니라 사용 해서는 안됩니다 .
@SvenMarnach의 답변을 기반으로하지만 조금 더 간단하고 deque를 사용하지 않습니다.
>>> def skip(iterable, at_start=0, at_end=0):
it = iter(iterable)
it = itertools.islice(it, at_start, None)
it, it1 = itertools.tee(it)
it1 = itertools.islice(it1, at_end, None)
return (next(it) for _ in it1)
>>> list(skip(range(10), at_start=2, at_end=2))
[2, 3, 4, 5, 6, 7]
>>> list(skip(range(10), at_start=2, at_end=5))
[2, 3, 4]
또한 내 timeit
결과에 따르면 이것은 deque 솔루션보다 약간 빠릅니다.
>>> iterable=xrange(1000)
>>> stmt1="""
def skip(iterable, at_start=0, at_end=0):
it = iter(iterable)
it = itertools.islice(it, at_start, None)
it, it1 = itertools.tee(it)
it1 = itertools.islice(it1, at_end, None)
return (next(it) for _ in it1)
list(skip(iterable,2,2))
"""
>>> stmt2="""
def skip(iterable, at_start=0, at_end=0):
it = iter(iterable)
for x in itertools.islice(it, at_start):
pass
queue = collections.deque(itertools.islice(it, at_end))
for x in it:
queue.append(x)
yield queue.popleft()
list(skip(iterable,2,2))
"""
>>> timeit.timeit(stmt = stmt1, setup='from __main__ import iterable, skip, itertools', number = 10000)
2.0313770640908047
>>> timeit.timeit(stmt = stmt2, setup='from __main__ import iterable, skip, itertools, collections', number = 10000)
2.9903135454296716
tee()
하면 생성기의 메모리에 여전히 전체 목록을 작성하고 있습니까? ( it1
예:
mylist=['one'.'two','three'.'four'.'five']
for i in mylist[1:]:
print(i)
파이썬 인덱스는 0부터 시작하여 슬라이싱 연산자를 사용하여 반복 조작을 할 수 있습니다.
for i in range(1,-1):
글쎄, 구문은 실제로 파이썬이 아닙니다.
파이썬에서 반복은 컨테이너의 내용 (기술적으로 반복자 이상)이며 구문이 for item in container
있습니다. 이 경우 컨테이너는 cars
목록이지만 첫 번째 요소와 마지막 요소를 건너 뛰고 싶습니다. 즉 cars[1:-1]
, 파이썬 목록은 0부터 시작하며 음수는 끝에서 세고 :
구문은 조각화합니다.
그래서 너는 원해
for c in cars[1:-1]:
do something with c
경우 cars
시퀀스는 당신은 할 수 있습니다
for car in cars[1:-1]:
pass
more_itertools
프로젝트를 확장itertools.islice
부정적인 인덱스를 처리 할 수 있습니다.
예
import more_itertools as mit
iterable = 'ABCDEFGH'
list(mit.islice_extended(iterable, 1, -1))
# Out: ['B', 'C', 'D', 'E', 'F', 'G']
따라서 iterable의 첫 번째 항목과 마지막 항목 사이에 슬라이스 요소를 우아하게 적용 할 수 있습니다.
for car in mit.islice_extended(cars, 1, -1):
# do something
for n, i in enumerate(cars): if n!= 0: do something to i
있습니다. 논리는 각 값에 '카운터'를 추가하여 예를 들어로 타겟팅 할 수 있다는 것입니다if n == some_value
. 이 예제에서는 첫 번째 인스턴스를 제외하고 i의 각 인스턴스에 무언가를 수행합니다.