[python] 파이썬에서 목록을 페어 (현재, 다음)로 반복하십시오.

파이썬에서 “현재”요소와 “다음”요소를보고 목록을 반복해야하는 경우가 있습니다. 지금까지 다음과 같은 코드로 수행했습니다.

for current, next in zip(the_list, the_list[1:]):
    # Do something

이것은 효과가 있고 내가 기대하는 것을 수행하지만 같은 일을하는 관용적이거나 효율적인 방법이 있습니까?



답변

itertools 모듈 문서 의 관련 예제는 다음과 같습니다 .

import itertools
def pairwise(iterable):
    "s -> (s0,s1), (s1,s2), (s2, s3), ..."
    a, b = itertools.tee(iterable)
    next(b, None)
    return zip(a, b)   

Python 2의 경우 다음 itertools.izip대신에 필요 합니다 zip.

import itertools
def pairwise(iterable):
    "s -> (s0,s1), (s1,s2), (s2, s3), ..."
    a, b = itertools.tee(iterable)
    next(b, None)
    return itertools.izip(a, b)

작동 방식 :

첫째, 두 개의 평행 반복기, ab(생성되는 tee()통화), 반복 가능한 원래의 첫 번째 요소를 모두 가리키는. 두 번째 반복자 b는 1 단계 앞으로 이동합니다 ( next(b, None)). 이 시점 a에서 s0을 b가리키고 s1을 가리 킵니다. 모두 ab독립적으로 원래의 반복자를 통과 할 수 – izip 기능은 두 반복자를 받아 같은 속도로 두 반복자를 발전 반환 된 요소의 쌍을, 수 있습니다.

한 가지주의 사항 :이 tee()함수는 서로 독립적으로 진행할 수있는 두 개의 반복자를 생성하지만 비용이 발생합니다. 반복자 중 하나가 다른 반복자보다 tee() 앞당겨진 경우, 두 번째 반복자가 너무 많이 소모 될 때까지 소비 된 요소를 메모리에 유지해야합니다 (원래 반복자를 ‘되감기’할 수 없음). 하나의 반복자가 다른 반복자보다 한 걸음 앞서 있기 때문에 중요하지 않지만 일반적 으로이 방법으로 많은 메모리를 사용하는 것은 쉽습니다.

그리고 이후 tee()취할 수있는 n매개 변수를,이 또한 두 개 이상의 병렬 반복자에 사용할 수 있습니다 :

def threes(iterator):
    "s -> (s0,s1,s2), (s1,s2,s3), (s2, s3,4), ..."
    a, b, c = itertools.tee(iterator, 3)
    next(b, None)
    next(c, None)
    next(c, None)
    return zip(a, b, c)


답변

자신의 롤!

def pairwise(iterable):
    it = iter(iterable)
    a = next(it, None)

    for b in it:
        yield (a, b)
        a = b


답변

때문에 the_list[1:]실제로는 (첫 번째 요소 제외) 전체 목록의 복사본을 생성하고, zip()목록의 총 세 개의 사본이라고 즉시 튜플의 목록을 생성 만들어집니다. 목록이 매우 큰 경우 선호 할 수 있습니다

from itertools import izip, islice
for current_item, next_item in izip(the_list, islice(the_list, 1, None)):
    print(current_item, next_item)

목록을 전혀 복사하지 않습니다.


답변

나는 이것을 이것을 내놓고있다. 나는 아무도 enumerate ()에 대해 생각하지 않았다는 것에 놀랐다.

for (index, thing) in enumerate(the_list):
    if index < len(the_list):
        current, next_ = thing, the_list[index + 1]
        #do something


답변

인덱스로 반복하면 같은 일을 할 수 있습니다.

#!/usr/bin/python
the_list = [1, 2, 3, 4]
for i in xrange(len(the_list) - 1):
    current_item, next_item = the_list[i], the_list[i + 1]
    print(current_item, next_item)

산출:

(1, 2)
(2, 3)
(3, 4)


답변

이제는 2020 년 5 월 16 일 현재 간단한 가져 오기입니다.

from more_itertools import pairwise
for current, next in pairwise(your_iterable):
  print(f'Current = {current}, next = {nxt}')

더 많은 도구를위한 문서이
코드는 다른 답변의 코드와 동일하지만 가능한 경우 가져 오기를 선호합니다.

아직 설치하지 않은 경우 :
pip install more-itertools

예를 들어, 피본 나치 수열이있는 경우 다음과 같이 후속 쌍의 비율을 계산할 수 있습니다.

from more_itertools import pairwise
fib= [1,1,2,3,5,8,13]
for current, nxt in pairwise(fib):
    ratio=current/nxt
    print(f'Curent = {current}, next = {nxt}, ratio = {ratio} ')


답변

목록 이해를 사용하여 목록에서 쌍

the_list = [1, 2, 3, 4]
pairs = [[the_list[i], the_list[i + 1]] for i in range(len(the_list) - 1)]
for [current_item, next_item] in pairs:
    print(current_item, next_item)

산출:

(1, 2)
(2, 3)
(3, 4)