[python] 목록의 마지막 항목을 제외한 모든 항목을 반복하는 방법은 무엇입니까?

각 항목을 확인한 다음 목록과 목록을 반복하고 싶습니다.

x에서 y를 사용하여 마지막 항목을 제외한 모든 항목을 반복 할 수있는 방법이 있습니까? 가능한 경우 색인을 사용하지 않고 선호합니다.

노트

freespace가 내 실제 질문에 대한 답변을했기 때문에 답변을 수락했지만 SilentGhost가 내가 요청한 질문에 답변했습니다.

혼란에 대한 사과.



답변

for x in y[:-1]

경우 y발전기, 다음 위의 의지없는 작품입니다.


답변

시퀀스 항목을 다음과 비교하는 가장 쉬운 방법 :

for i, j in zip(a, a[1:]):
     # compare i (the current) to j (the following)


답변

시퀀스 쌍의 모든 요소를 ​​현명하게 얻으려면이 접근법을 사용하십시오 (쌍별 함수는 itertools 모듈의 예제에서 온 것입니다).

from itertools import tee, izip, chain

def pairwise(seq):
    a,b = tee(seq)
    b.next()
    return izip(a,b)

for current_item, next_item in pairwise(y):
    if compare(current_item, next_item):
        # do what you have to do

마지막 값을 특정 값과 비교해야하는 경우 해당 값을 끝으로 연결하십시오

for current, next_item in pairwise(chain(y, [None])):


답변

목록에서 n 번째 항목을 n + 1 번째 항목과 비교하려는 경우 다음 작업을 수행 할 수도 있습니다

>>> for i in range(len(list[:-1])):
...     print list[i]>list[i+1]

거기에는 하드 코딩이 없습니다. 다른 느낌이 없으면 괜찮습니다.


답변

목록을 인스턴스화하지 않고 반복기의 다음 항목과 각 항목을 비교하려면 다음을 수행하십시오.

import itertools
it = (x for x in range(10))
data1, data2 = itertools.tee(it)
data2.next()
for a, b in itertools.izip(data1, data2):
  print a, b


답변

이것은 OP 가 요구 한 것에 응답합니다. 즉, 연속적인 요소 (우수한 SilentGhost 답변)를 비교하는 목록을 순회 하지만 모든 그룹 ( n-gram )에 대해 일반화됩니다 : 2, 3, … n:

zip(*(l[start:] for start in range(0, n)))

예 :

l = range(0, 4)  # [0, 1, 2, 3]

list(zip(*(l[start:] for start in range(0, 2)))) # == [(0, 1), (1, 2), (2, 3)]
list(zip(*(l[start:] for start in range(0, 3)))) # == [(0, 1, 2), (1, 2, 3)]
list(zip(*(l[start:] for start in range(0, 4)))) # == [(0, 1, 2, 3)]
list(zip(*(l[start:] for start in range(0, 5)))) # == []

설명 :

  • l[start:] 인덱스에서 시작하여 목록 / 생성기 생성 start
  • *list또는 *generator: zip작성된 것처럼 모든 요소를 ​​둘러싸는 함수에 전달zip(elem1, elem2, ...)

노트 :

AFAIK,이 코드는 가능한 한 게으르다. 검증되지 않은.


답변