「ロックステップ」で複数のリスト (技術的にはイテラブル) を反復するには、 を使用できますzip
。この場合、mylist
オフセット 0、12、2、および 13 の 4 つのバージョンを反復します。
zippedLists = zip(mylist, mylist[12:], mylist[2:], mylist[13:])
次に、0 番目、12 番目、24 番目などの要素が必要です。これはスライスで行われます:
slicedList = zippedLists[::12]
次に、それを繰り返すことができます:
for elt1, elt13, elt2, elt14 in slicedList:
if elt1 == elt13 and elt2 == elt14:
print elt1
ファイル操作と組み合わせると、
#prints out samenodes
f = open('newerfile.txt')
mylist = list(f)
zippedLists = zip(mylist, mylist[12:], mylist[2:], mylist[13:])
slicedList = zippedLists[::12]
for elt1, elt13, elt2, elt14 in slicedList:
if elt1 == elt13 and elt2 == elt14:
print elt1
このようなコードは、通常、現在のバージョンよりも「pythonic」であると見なされます。これは、リストを反復処理するときにリスト インデックスを使用することは一般的に推奨されないためです。
リストに膨大な数の要素がある場合、上記のコードは 5 つの余分なリストを作成 (そしてある時点で破棄) することに注意してください。itertools
したがって、リストの不必要なコピーを防ぐために遅延イテレータを使用する で同等の関数を使用すると、メモリ パフォーマンスが向上する可能性があります。
from itertools import islice, izip
#prints out samenodes
f = open('newerfile.txt')
mylist = list(f)
zippedLists = itertools.izip(mylist, islice(mylist, 12), islice(mylist, 2), islice(mylist, 13))
slicedList = itertools.islice(zippedLists, 0, None, 12)
for elt1, elt13, elt2, elt14 in slicedList:
if elt1 == elt13 and elt2 == elt14:
print elt1
おそらく、itertools
ファイル全体を に丸呑みするのを避ける方法mylist
があると思いますが、それが何であるか覚えていませんitertools.tee
。