1
mylist="'a','b','c'"

count=0
i=0

while count< len(mylist):
    if mylist[i]==mylist[i+1]:
        print mylist[i]
    count +=1
    i +=1

エラー:

File "<string>", line 6, in <module>
IndexError: string index out of range

最後の (n 番目の) 要素に到達すると、比較する n+1 が見つからないため、エラーが発生すると想定しています。

興味深いことに、私は以前にこれを行ったことがあり、より大きなリストでこの問題を抱えていなかったと思います: ここに例があります (それを修正した Raymond Hettinger の功績による)

list=['a','a','x','c','e','e','f','f','f']

i=0
count = 0

while count < len(list)-2:
    if list[i] == list[i+1]:
        if list [i+1] != list [i+2]:
            print list[i]
            i+=1
            count +=1
        else:
            print "no"
            count += 1
    else:   
        i +=1
        count += 1

私が試みた方法でリストをクロールする場合、「範囲外」にならないようにするための修正はありますか? これを非常に大きなリストに実装する予定です。たとえば、「list[i]==list[i+16]」かどうかを確認する必要があります。今後は、「if int(mylist[i+3])-int(mylist[i+7])>10: newerlist.append[mylist[i]」のような条件を追加したいと考えています。ですから、私がこの問題を解決することが重要です。

break文を入れようかと思ったのですが、だめでした。

これが最も効率的ではないことはわかっていますが、それが最もよく理解しているところです。

4

4 に答える 4

5

したがって、リスト内の要素をさまざまな固定オフセットで比較しようとしているようです。おそらく、このようなものがあなたを助けることができます:

for old, new in zip(lst, lst[n:]):
    if some_cond(old, new):
        do_work()

説明:

lst[n:]n 番目 (0-indexing に注意してください) 要素から始まる lst のコピーを返します

>>> lst = [1,2,2,3];
>>> lst[1:]
[2,2,3]

zip(l1, l2)各リストから 1 つの要素を使用して、タプルの新しいリストを作成します

>>> zip(lst, lst[1:])
[(1, 2), (2, 2), (2, 3)]

いずれかのリストがなくなるとすぐに停止することに注意してください。この場合、オフセット リストが最初に実行されます。

タプルのリストの場合、ループ変数で「直接アップパック」できるため、

for old, new in zip(lst, lst[1:])

必要な要素をループします(リスト内の連続する要素のペア)

于 2013-05-19T15:01:31.623 に答える
1

一般的な考え方として、特定の数の場所を先読みしようとしている場合は、いくつかのことができます。

  1. ループ チェック (つまり、カウント < 長さ) では、最大フィールドをチェックする必要があります。したがって、あなたの例では、16 スペースに移動したいと考えていました。これは、count < (length - 16) をチェックする必要があることを意味します。欠点は、最後の要素 (最後の 16 個) が繰り返されないことです。

  2. ループ内をチェックして、インデックスが適用可能であることを確認します。つまり、各 if ステートメントは、if(I+16 < length && logic_you_want_to_check) で始まります。これにより、ループを続行できますが、範囲外でロジックが失敗しても、エラーは発生しません。

  3. 注-これはおそらくあなたが望むものではありませんが、完全を期すために追加することはできません. ロジックをラップします。これは、ラップアラウンドが考慮できる場合にのみ機能します。文字通り、現在のインデックスよりも 16 番目のインデックスを確認したい場合 (つまり、行内の場所のように)、ラップアラウンドはあまり適していません。ただし、そのロジックが必要なく、循環パターンで値をモデル化したい場合は、インデックスをモジュラスにすることができます。つまり、if array[i] == array [(i + 16)%length(array)] は、16 先をチェックするか、配列の先頭にラップアラウンドします。

于 2013-05-19T15:03:51.033 に答える