回答:
for x in y[:-1]
yがジェネレーターの場合、上記は機能しません。
y発電機の場合の代替手段は何ですか?
シーケンスペアのすべての要素を賢く取得したい場合は、このアプローチを使用します(ペアワイズ関数は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が何を求めている必要があり、連続する要素(優れた比較すなわちトラバースAリストSilentGhostの答えは)、まだグループ(一般用nグラム 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*listor *generator:すべての要素を、zipそれが書かれたかのように囲み関数に渡しますzip(elem1, elem2, ...)注意:
私の知る限り、このコードはそれが可能な限り怠惰です。未検証。