파이썬에서 “현재”요소와 “다음”요소를보고 목록을 반복해야하는 경우가 있습니다. 지금까지 다음과 같은 코드로 수행했습니다.
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)
작동 방식 :
첫째, 두 개의 평행 반복기, a
및 b
(생성되는 tee()
통화), 반복 가능한 원래의 첫 번째 요소를 모두 가리키는. 두 번째 반복자 b
는 1 단계 앞으로 이동합니다 ( next(b, None)
). 이 시점 a
에서 s0을 b
가리키고 s1을 가리 킵니다. 모두 a
와 b
독립적으로 원래의 반복자를 통과 할 수 – 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)
