2012-04-14 15 views
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' 以上。

大部分的兩個字符都被刪除了,但是還有一些,我做錯了什麼?

+0

什麼語言是什麼?什麼是'doc'? – yamen 2012-04-14 03:24:31

+0

對不起,這是蟒蛇。 'doc'實際上只是隨機單詞和數字的列表 – Carlll 2012-04-14 03:27:16

+0

歡迎來到StackOverflow。你的標籤沒有任何意義。請編輯您的問題並使用有意義的標籤,例如您開始使用的語言(以及「doc」的定義及其內容的示例會有所幫助)。發佈幾個對任何人都沒有任何意義的詞彙,除了你對你(或其他任何人)沒有幫助。謝謝。 :) – 2012-04-14 03:28:02

回答

2

你應該顛倒邏輯和使用列表理解:

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

我建議使用list comprehensions

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

strip()將刪除空白。

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 ] 

歡迎蟒蛇。

+0

我很高興看到有人試圖解釋爲什麼OP的方法出錯了,而不僅僅是說列表理解更酷更好(: – octern 2012-04-14 03:35:13

+0

@octern不幸的是,這個_doesn't_解釋了爲什麼,儘管它確實顯示了一個例子它發生了 – agf 2012-04-14 03:58:12

+0

我沒有找到任何關於python for for循環的文檔,但是從輸出結果來看,我猜測問題是:如果在arr中有for x,在索引爲'i'的'x',並且你是'arr。 remove(x)',下一個'x'不是'arr [i + 1]',而是'arr [i + 2]' - >這意味着python會跳過'arr'的一個成員。 – 2012-04-14 04:07:15

0

改爲創建要刪除元素的列表的副本。

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

通常,覆蓋您正在迭代的數據並不是一個好習慣。你遇到了問題,就像你剛剛在這裏做的那樣。

1

爲了準確回答你的問題,我們需要看看doc的內容是什麼。最好以格式顯示在交互式Python解釋器中。

話雖這麼說,理想的(讀Python化)的方式從列表中刪除的項目將是A)使用filter

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

或B)使用列表理解:

[word for word in doc if len(word) > 2] 
+1

「過濾器」不被認爲是pythonic,因爲列表解析使得一切都更清晰。 – jamylak 2012-04-14 04:19:39

+1

@jamylak:的確如此。我想我錯過了。儘管如此,它避免了使用解釋循環。 – 2012-04-14 04:26:58

0

當您移除一個元素時,列表會移動,並且循環將繼續使用+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]