python의 루프에 대해 첫 번째 엔트리를 건너뛰시겠습니까?
Python에서는 다음과 같은 작업을 수행하는 방법:
for car in cars:
# Skip first and last, do work for rest
Python의 첫 번째 요소를 건너뛰기 위해 간단히 쓸 수 있습니다.
for car in cars[1:]:
# Do What Ever you want
또는 마지막 elem을 건너뜁니다.
for car in cars[:-1]:
# Do What Ever you want
이 개념은 임의의 경우에 사용할 수 있습니다(단, 어떤 경우에도 사용할 수 없습니다).
다른 답변은 시퀀스에 대해서만 작동합니다.
반복 가능한 경우 첫 번째 항목을 건너뜁니다.
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'
첫 번째 항목을 건너뛸 수 있는 가장 좋은 방법은 다음과 같습니다.
from itertools import islice
for car in islice(cars, 1, None):
pass
# do something
islice
이 경우 시작점에서 호출됩니다.1
, 및 의 엔드 포인트None
(의 끝을 나타냅니다).
엔드에서 아이템을 건너뛸 수 있다.iterable
의 길이를 알아야 합니다(목록은 항상 가능하지만 반복할 수 있는 모든 것은 아닙니다).예를들면,islice(cars, 1, len(cars)-1)
의 첫 번째 항목과 마지막 항목을 건너뜁니다.cars
.
다음은 반복 가능의 시작과 끝에서 임의의 수의 항목을 건너뛰는 보다 일반적인 제너레이터 함수입니다.
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]
for item in list_name[1:-1]:
#...do whatever
예제:
mylist=['one','two','three','four','five']
for i in mylist[1:]:
print(i)
0부터 시작하는 python 인덱스에서는 슬라이싱 연산자를 사용하여 반복 조작을 할 수 있습니다.
for i in range(1,-1):
여기 내가 선호하는 선택이 있다.루프를 많이 추가할 필요가 없으며 내장된 툴만 사용합니다.
이동처:
for item in my_items:
do_something(item)
대상:
for i, item in enumerate(my_items):
if i == 0:
continue
do_something(item)
음, 당신의 구문은 사실 Python이 아닙니다.
Python의 반복은 컨테이너의 내용(음, 기술적으로 반복기) 위에 구문과 함께 있습니다.for item in container
이 경우 컨테이너는cars
첫 번째 요소와 마지막 요소를 건너뛰고 싶기 때문에cars[1:-1]
(마이너스 리스트는 제로 베이스의 음수 카운트입니다).:
슬라이싱 구문입니다.
그래서 네가 원하는 건
for c in cars[1:-1]:
do something with c
@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
그 결과, 이것은 디큐 솔루션보다 약간 더 빠릅니다.
>>> 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
한다면cars
할 수 있는 시퀀스입니다.
for car in cars[1:-1]:
pass
대체 방법:
for idx, car in enumerate(cars):
# Skip first line.
if not idx:
continue
# Skip last line.
if idx + 1 == len(cars):
continue
# Real code here.
print car
프로젝트가 확장되다itertools.islice
음의 지수를 처리합니다.
예
import more_itertools as mit
iterable = 'ABCDEFGH'
list(mit.islice_extended(iterable, 1, -1))
# Out: ['B', 'C', 'D', 'E', 'F', 'G']
따라서 반복 가능한 첫 번째 항목과 마지막 항목 사이에 슬라이스 요소를 우아하게 적용할 수 있습니다.
for car in mit.islice_extended(cars, 1, -1):
# do something
다음을 지원하는 데 적합한 솔루션itertools.chain
사용하는 것이다itertools.islice
반복할 수 있는 것을 한 조각 떼어내려면:
your_input_list = ['list', 'of', 'things']
for i, variant in list(itertools.islice(enumerate(some_function_that_will_output_itertools_chain(your_input_list)), 1, None)):
"""
# No need for unnecessary conditions like this:
if i == 0:
continue
"""
variant = list(variant) # (optional) converting back to list
print(variant)
해킹처럼 보이지만 매번 작동합니다.
ls_of_things = ['apple', 'car', 'truck', 'bike', 'banana']
first = 0
last = len(ls_of_things)
for items in ls_of_things:
if first == 0
first = first + 1
pass
elif first == last - 1:
break
else:
do_stuff
first = first + 1
pass
언급URL : https://stackoverflow.com/questions/10079216/skip-first-entry-in-for-loop-in-python
'it-source' 카테고리의 다른 글
Java에서 UUID의 최상위 비트를 사용한 충돌 가능성 (0) | 2022.10.20 |
---|---|
인터페이스를 구현하는 Java 클래스 찾기 (0) | 2022.10.20 |
intXX_t와 int_fastXX_t의 차이점은 무엇입니까? (0) | 2022.10.20 |
uuid v4 대 v6(순서 완료), MySQL에서 더 효율적인 것은 무엇입니까? (0) | 2022.10.20 |
2개의 정수의 XOR이 범위를 벗어날 수 있습니까? (0) | 2022.10.20 |