这感觉就像一个非常简单的解决方案,但我无法让它发挥作用:
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 :(得分: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
参数为None
,deletechars
参数为标点符号。
您现在可以根据地图或列表推导重写您的功能。例如:
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']