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


160

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

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

노트

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

혼란에 대한 사과.

답변:


316
for x in y[:-1]

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


그것은 내 질문에 대답합니다. 감사하지만 x 후에 항목을 얻는 방법을 묻는 것을 잊었습니다. 이게 가능해?
David Sykes

3
-1 나는 그 질문에 대답하지 않는다고 생각합니다. 각 항목을 다음 항목과 비교하지 않습니다. – odwl 0 초 전에
odwl

4
내가 한 것 같아 저자는 X를하고 싶다고 말한 다음 Y를 어떻게 할 수 있는지 물었다. 나는 Y를 어떻게 할 수 있는지 대답했다. 그가 대답을 받아 들였다는 것은 그가 실제로 묻고 싶은 질문이 아니라면 내가 묻는 질문에 대답했음을 나타낼 것이다 . Asker는이 답변을 강등 할 수 있습니다.
freespace

7
OP가 첫 번째 질문에 다른 질문을했다고해서 그의 질문과이 답변이 다른 사람에게는 그다지 유용하지 않다는 것을 의미하지는 않습니다. +1
교수 Falken

1
생성기에서는 작동하지 않는다고 언급했습니다. y발전기가 언제 대안 입니까?
Joost

50

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

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

15
이것은 내가 원했던 질문에 대답합니다. 감사합니다
David Sykes

3
zip은 더 긴 목록을 더 짧은 길이로 자르기 때문에 실제로 첫 번째 슬라이스를 생략 할 수 있습니다. 이렇게하면 하나의 목록 작성이 저장됩니다. (만약 당신이 거대한리스트를 다루는 경우에. 그러나 그 경우에는 아무것도 복사하지 않는 Ants Aasma의 접근법을 따라야한다.)
bayer

19

시퀀스 쌍의 모든 요소를 ​​현명하게 얻으려면이 접근법을 사용하십시오 (쌍별 함수는 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])):

변수 이름 섀도 내장에 다음을
사용함

1
변수의 범위가 작고 이름이 가독성에 좋을 때 개인적으로 덜 사용되는 내장을 음영 처리하지 않아도됩니다. 그럼에도 불구하고 좋은 코딩 방법을 유지하기 위해 변수 이름을 편집했습니다.
Ants Aasma

5

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

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

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


3
리스트 복사를 피하기 위해 len (list [:-1])을 len (list)-1로 바꿀 수 있습니다. list라는 변수를 사용하지 마십시오.
Remy Blank

2

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

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

2
개미 Aasma에 의해 제안되었다 정확히의 그 stackoverflow.com/questions/914715/...
SilentGhost

1

이것은 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,이 코드는 가능한 한 게으르다. 검증되지 않은.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.