4

私はこのようなものを持っています:

#tokens is a list of a few words
for i in xrange(0,len(tokens)):
    #some code to modify the contents of token[i]
    if tokens[i] == some value:
        del tokens[i]

配列に 7 つの要素がある場合、i は 0 から 6 になり、処理の途中で配列要素を削除すると、新しいサイズは 6 になりますが、ループは i=6 まで実行され、tokens[6 にアクセスします] 新しいサイズが 6、つまり最大インデックスが 5 であるため、エラーがスローされます。

次のような条件で while ループを使用できると思います。

while(i<currMaxIndex)

ここで、currMaxIndex を動的に変更できます。

しかし、for ループ自体で i を変更する方法があるかどうかを知りたいと思っていました。

絶対に知っておく必要がある場合、これは私のコードです:

for i in xrange(0,len(tokens)):
            tokens[i]=tokens[i].translate(string.maketrans("",""),string.punctuation)
            if tokens[i]=='':
                del tokens[i]
4

2 に答える 2

4

私はこれを行います:

def myfilter(token):
    return token.translate(None, string.punctuation)   

tokens = filter(None, map(myfilter, tokens))

ロジックが複雑すぎてマップ/フィルターを通過できない場合は、次のアプローチを使用することをお勧めします。

for item in items[:]: # [:] copies the list
    if condition(item):
        items.remove(item)
于 2012-10-08T05:25:22.187 に答える
2

len(tokens)xrangeオブジェクトの作成時に計算されるため、リストから要素を削除する場合は、tokens[i]存在しないか、期待した値とは異なる値になる可能性があります。

例えば:

>>> a = [1, 2, 3]
>>> a[1]
2
>>> del a[1]
>>> a[1]
3

元のリストを変更する代わりに、新しいリストを作成します。

new_tokens = []

for token in tokens:
    translated = token.translate(None, string.punctuation)

    if translated:
        new_tokens.append(translated)

filterまたは、ジェネレータ式を使用できます。

new_tokens = filter(None, (token.translate(None, string.punctuation) for token in tokens))
于 2012-10-08T05:15:57.247 に答える