it-source

python의 루프에 대해 첫 번째 엔트리를 건너뛰시겠습니까?

criticalcode 2022. 10. 20. 21:16
반응형

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

반응형