1

私のコード:

#prints out samenodes
f = open('newerfile.txt')
mylist = list(f)
count = 0
i = 1
while count < 1000:
    if mylist[i] == mylist[i+12] and mylist [i+3] == mylist [i+14]: 
        print mylist[i]
    count = count+1
        i = i+12

私の意図は、elt 1、elt 2 を見ることです。elt 1 == elt 13 AND elt 2==elt 14 の場合、elt 1 を印刷したい。次に、elt 13 と elt 14 を見たい。elt 2 が一致する場合elt 13+12 AND elt 14 は elt 14+12 に一致します。印刷したいです。等...

この基準に適合するリストの一部は確かにありますが、プログラムは出力を返しません。

4

2 に答える 2

3

1 つの問題はインデックスです。リストはインデックス 0 で始まることに注意してください。

誰もまだこれに答えていないことに驚いています:

#prints out samenodes
f = open('newerfile.txt')
mylist = list(f)
count = 0
i = 0
while count < 1000:
    #print mylist[i]
    #print mylist[i+12]
    #print mylist[i+13]
    #print mylist[i+14]
    #...use prints to help you debug
    if mylist[i] == mylist[i+12] and mylist [i+1] == mylist [i+13]: 
        print mylist[i]
    count = count+1
    i = i+12

これはおそらくあなたが望むものです。

于 2013-05-15T11:29:38.437 に答える
2

「ロックステップ」で複数のリスト (技術的にはイテラブル) を反復するには、 を使用できます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

于 2013-05-15T12:17:33.963 に答える