1

文字列のリスト内の各要素からサブ文字列を削除しようとしています。削除したい複数の部分文字列(ストップワード)を持つ文字列の場合の処理​​方法を理解するのに問題があります。

wines = ("2008 Chardonnay", "Cabernet Sauvignon 2009", "Bordeaux 2005 Cotes du Rhone")
stop_words = ("2005", "2008", "2009", "Cotes du Rhone")
result = []

for wine in wines:
    for stop in stop_words:
        if stop in wine:
            x = wine.replace(stop, "")
            result.append(x)

print result

ifステートメントをforまたはwhileに変更すると、ガベージが返されるか、ハングします。何かアドバイス?

4

3 に答える 3

3

少しインデントして変数を変更すると、問題が解決します

for wine in wines:
    glass=wine #Lets pour your wine in a glass
    for stop in stop_words:
        if stop in glass: #Is stop in your glass? 
            #Replace stop in glass and pour it in the glass again
            glass = glass.replace(stop, "") 
    result.append(glass) #Finally pour the content from your glass to result


result
[' Chardonnay', 'Cabernet Sauvignon ', 'Bordeaux  ']

冒険したい場合は、正規表現を使用できます。この場合、正規表現は単純なループよりも高速である可能性があります

>>> for wine in wines:
    result.append(re.sub('('+'|'.join(stop_words)+')','',wine))    

>>> result
[' Chardonnay', 'Cabernet Sauvignon ', 'Bordeaux  ']
>>> 

またはリスト内包としてそれを作る

>>> [re.sub('('+'|'.join(stop_words)+')','',wine) for wine in wines]
[' Chardonnay', 'Cabernet Sauvignon ', 'Bordeaux  ']
>>> 
于 2012-04-10T16:15:34.217 に答える
1
wines = ("2008 Chardonnay", "Cabernet Sauvignon 2009", "Bordeaux 2005 Cotes du Rhone")
stop_words = ("2005", "2008", "2009", "Cotes du Rhone")
result = []

for wine in wines:
    x = wine
    for stop in stop_words:        
        x = x.replace(stop, "")
    result.append(x)

print result

使用regexする方がはるかに優れたIMOになります

>>> wines = ("2008 Chardonnay", "Cabernet Sauvignon 2009", "Bordeaux 2005 Cotes du Rhone")
>>> stop_words = ("2005", "2008", "2009", "Cotes du Rhone")
>>> import re
>>> [re.sub('|'.join(stop_words),'',wine) for wine in wines]
[' Chardonnay', 'Cabernet Sauvignon ', 'Bordeaux  ']
于 2012-04-10T16:16:16.103 に答える
0

ワンライナーとして、jamylaksの使用の提案を考慮に入れてstrip()

[reduce(lambda x,y: x.replace(y, "").strip(), stop_words, wine) for wine in wines]

reduce()これはPython2.xでは正常に機能しますが、別のライブラリに移動されたため、Python3では機能しないことに注意してください。Python 3を使用している場合は、次のようにします。

import functools as ft
[ft.reduce(lambda x,y: x.replace(y, "").strip(), stop_words, wine) for wine in wines]
于 2012-04-10T16:30:32.573 に答える