2017-08-07 110 views
2
for x,y in words: 
    for z in x: 
     if z in stopwords: 
      del x[x.index(z)] 

這是我的代碼。在字的數據是元組的列表,其中一個元組看起來是這樣的:del似乎沒有從列表中刪除任何東西

(list of words, metadata) 

我的代碼的目的是從單詞的列表中刪除所有的禁用詞。 唯一的問題是,停用詞不會被刪除後...

我究竟做錯了什麼? 我已經嘗試過用

x.pop(x.index(z)) 

做到這一點,但似乎不有所作爲。

stopwords = set(stopwords) # just so "in" checks are faster 
result = [([word for word in x if word not in stopwords], y) for x, y in words] 

例如:

>>> stopwords = ['stop'] 
>>> words = [(['hello', 'you', 'stop'], 'somemeta')] 
>>> stopwords = set(stopwords) # just so "in" checks are faster 
>>> result = [([word for word in x if word not in stopwords], y) for x, y in words] 
>>> result 
[(['hello', 'you'], 'somemeta')] 

請注意,您一般不應該修改的列表,你」

+3

迭代時從列表中刪除數據不是一個好主意,並且很可能會產生未定義的行爲。相反,我會嘗試將您的問題列爲理解,並創建一個符合您的標準的新列表。 –

+0

請給出一個單詞和停用詞的例子 – nacho

回答

4

你可以使用嵌套列表理解簡單地創建一個沒有停止的話一個新的列表重新迭代。這可能導致很多難以追蹤的錯誤。

+0

你會介意解釋爲什麼你創建一組停用詞嗎?我不明白意見對不起 – DrBwts

+2

成員測試的(平均)漸近運行時對於集合是'O(1)' - 對於其他容器,如列表和元組,它是'O(n)'(另見https:// wiki。 python.org/moin/TimeComplexity)。特別是因爲'in'檢查是在內部循環中完成的,潛在的節約可能是巨大的。 – MSeifert

0
for x,y in words: 
    for z in x: 
     if z in stopwords: 
      del x[x.index(z)] 

最外面的循環將x分配給您的單詞列表之一。暫時忽略y。第二個循環遍歷該單詞列表; removing elements from a list you're iterating over causes peculiar behaviour。它很可能會跳過特定的單詞。這適用於所有del,pop,remove和slice替換。

確保stopwordsset並基於此篩選每個單詞會更有效:x[:] = [w for w in x if w not in stopwords]而不是該內部循環。此處的切片更換純粹是爲了確保x保持相同的對象,在這種情況下確保words內的條目發生更改。 這不會遇到上述迭代問題,因爲列表理解在分配將其存儲到片中之前構建其列表。

相關問題