2015-10-13 31 views
1

這感覺就像一個很容易解決,但我不能得到這個工作:Python的.replace()內的雙for循環問題

def cleaning(recipe): 
    #make every element lowercase 
    recipe = [str.lower(i) for i in recipe] 

    #remove punctuations 
    chars = "\\`\'\"*_{}[]%&()>#+-.!$" 

    for c in chars: 
     for item in recipe: 
      if c in item: 
       item = item.replace(c,'') 

    return recipe 

如果我用這個^功能,並運行此,

blah = ['Salt', 'Hot&Sour Sauce'] 
blah = cleaning(blah) 

我得到:

['salt', 'hot&sour sauce'] 

隨着字符替換未生效。 感覺像一個非常基本的問題,有人可以指出快速修復?

謝謝!

+0

你創建與'item.replace()'調用 – wim

+0

副本...然後不與副本覆蓋列表元素的當前值。 – TigerhawkT3

+0

你期望的結果是'['salt','hotsour sauce']'?順便說一下, –

回答

1

的問題列表在這裏:

for c in chars: 
    for item in recipe: 
     if c in item: 
      item = item.replace(c,'') 

你分配一個新的字符串到item參考,但沒有按不會更改list中的值。要麼遍歷索引(例如for i in range(len(recipe))... recipe[i] = new_string),要麼使用不同的策略,可能是不涉及嵌套循環的策略。

>>> r = ['Salt', 'Hot&Sour Sauce'] 

你可以使用正則表達式:

>>> import re 
>>> def cleaning(recipe): 
...  return list(map(lambda item: re.sub(r'''[\\`'"*_{}\[\]%&()>#+-.!$]*''', '', item.lower()), recipe)) 
... 
>>> cleaning(r) 
['salt', 'hotsour sauce'] 

或過濾器:

>>> def cleaning(recipe): 
...  return [''.join(filter(lambda i: i not in "\\`\'\"*_{}[]%&()>#+-.!$", item.lower())) for item in recipe] 
... 
>>> cleaning(r) 
['salt', 'hotsour sauce'] 
1

要更新項目,但沒有更新包含項目

chars = "\\`\'\"*_{}[]%&()>#+-.!$" 

recipe = ['Salt', 'Hot&Sour Sauce'] 
print(recipe) 
for c in chars: 
    for i, item in enumerate(recipe): 
     if c in item: 
      item = item.replace(c,'') 
      recipe[i] = item # here the list is updated. 

print(recipe) 

['Salt', 'Hot&Sour Sauce'] 
['Salt', 'HotSour Sauce'] 
1

你不能真正用出來明確地分配給在列表中的條目發生變異的名單。換句話說,執行item = item.replace(c,'')將不會對recipe執行任何操作。

您可以通過枚舉修改列表的工作方式,但您可能需要考慮映射或列表理解,就像您將recipe轉換爲小寫一樣。在這種情況下,您可以使用str.translate的特殊情況,其中table參數爲Nonedeletechars參數爲標點符號。

您現在可以根據地圖或列表推導重寫您的函數。例如:

def cleaning(recipe): 
    punc = "\\`\'\"*_{}[]%&()>#+-.!$" 
    rm_punc = lambda s: str.translate(s.lower(), None, punc) #Special case of str.translate. 
    return map(rm_punc, recipe) #Remove the punctuation. 

blah = ['Salt', 'Hot&Sour Sauce'] 
blah = cleaning(blah) 

print blah 

打印:

['salt', 'hotsour sauce'] 
+0

您可以通過直接在's.lower()'上執行'translate'來擺脫第二個'map'。 – TigerhawkT3

+0

@ TigerhawkT3:已更新。感謝您的支持。 – Dair