Python .replace()里面有双For循环问题

时间:2015-10-13 02:25:58

标签: python for-loop

这感觉就像一个非常简单的解决方案,但我无法让它发挥作用:

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']

字符替换未生效。 感觉像一个非常基本的问题,有人可以指出快速解决方案吗?

谢谢!

3 个答案:

答案 0 :(得分: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 :(得分: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']

答案 2 :(得分: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']