1

これが私がすることです:

for word in doc:
    if len(word) < 3:
        doc.remove(word)

しかし、私がこれを行う場合:

for word in doc:
    if len(word) < 3:
        print word

返される結果は次のとおりです。'O、''Of''30''4。' '私。' 「IF」など。

ほとんどの2つのキャラクターアイテムが削除されますが、いくつかはまだ残っています、私は何か間違ったことをしていますか?

4

6 に答える 6

5

問題はPythonのforループです。

例:これが好きな場合:

arr = range(1, 10)
for x in arr:
    print x
    arr.remove(x)

次に、arrのすべてのアイテムが削除されたわけではないことがわかります。

あなたの場合、私たちはこのようにすることができます:

newDoc = [ word for word in doc if len(word) >= 3 ]

Pythonへようこそ。

于 2012-04-14T03:34:05.173 に答える
2

ロジックを反転し、リスト内包表記を使用する必要があります。

[ word for word in doc if len(word) >= 3 ]
于 2012-04-14T03:31:12.510 に答える
2

あなたの質問に正確に答えるには、 の内容を確認する必要がありdocます。インタラクティブな Python インタープリターで表示される形式であることが望ましいです。

そうは言っても、リストからアイテムを削除する理想的な(pythonicを読む)方法は、A)使用することfilterです:

filter(lambda x: len(x) > 2, doc)

または B) リスト内包表記を使用します。

[word for word in doc if len(word) > 2]
于 2012-04-14T03:37:39.087 に答える
1

リスト内包表記を使用することをお勧めします

doc = [w.strip() for w in doc if len(w.strip()) >= 3]

strip()空白を削除します。

于 2012-04-14T03:33:29.453 に答える
0

要素を削除すると、リストがシフトし、+1 のインデックス付き要素でループが続行されます。次に、単語を 1 つスキップします。

テストするには、インタープリターに次のように記述します。

l = range(5)
for i in l:
    l.remove(i)
    print i, l

結果:

0 [1, 2, 3, 4]  
2 [1, 3, 4]  
4 [1, 3]  
于 2012-04-14T15:43:43.490 に答える
0

代わりに、要素を削除するリストのコピーを作成します。

for word in doc[:]:
    if len(word) < 3:
        doc.remove(word)

一般に、反復処理中のデータを上書きすることはお勧めできません。ここで行ったような問題に遭遇します。

于 2012-04-14T03:35:33.037 に答える