为什么这个for循环没有效果? (蟒蛇)

时间:2013-06-14 18:44:35

标签: python for-loop

我有一个包含城市,城市和标点符号的变量,然后是邮政编码。我正在使用语句删除标点符号(和其他流浪)字符。它看起来像这样:

for c in "!@#%&*()[]{}/?<>,.":
    jobLocationCleaned = string.replace(jobLocationUnclean, c, "")
jobLocation = jobLocationCleaned

# Add to list
params.append(jobLocation)
print(jobLocation)

然而,当使用Debug时,我可以看到代码一步一步完成它应该在print语句时它应该在清理之前打印地址的工作,即{{1} } loop没有效果。

为什么会这样?

3 个答案:

答案 0 :(得分:9)

在循环中,您永远不会使用上一次迭代的结果而是使用原始字符串。这是你问题的根源。

答案 1 :(得分:4)

在每次迭代中,您正在jobLocationUnclean进行替换,但将结果分配给jobLocationClean。由于您在每次迭代时使用相同的不干净起点,因此只有最后一次迭代才会对结果产生任何影响。尝试将代码更改为以下内容:

jobLocation = jobLocationUnclean
for c in "!@#%&*()[]{}/?<>,.":
    jobLocation = jobLocation.replace(c, "")

params.append(jobLocation)
print(jobLocation)

请注意,我还做了两个小修改,我只使用jobLocation并删除了jobLocationClean,因为它是不必要的,而不是string.replace(jobLocation, c, "")我使用了jobLocation.replace(c, "") 。这是直接在对象上而不是从字符串模块调用字符串函数的推荐方法。

答案 2 :(得分:0)

您应该使用regex

>>> import re
>>> from string import punctuation as punc
>>> strs = "Abc*@ddf%^sad#"
>>> re.sub(r'[{}]'.format(punc),'',strs)
'Abcddfsad'

修复代码:

>>> jobLocationUnclean = 'Abc*@ddf%sad#'
>>> for c in "!@#%&*()[]{}/?<>,.":
        #re-assign the new string to the `jobLocationUnclean`
        jobLocationUnclean = jobLocationUnclean.replace(c, "")
>>> jobLocationUnclean
'Abcddfsad'

为什么你的代码失败了?

在你的代码中,你循环遍历这些标点并指定一个 将jobLocationUnclean的值替换为jobLocationCleaned,但请注意 字符串在python中是不可变的,因此replace(jobLocationUnclean, c, "") 操作根本不会更改原始jobLocationUnclean。因此,在每次迭代中,您将替换给定的标点符号并将新字符串分配给jobLocationCleaned。 对字符串的任何操作总是返回一个新字符串。

>>> strs = "foo"
>>> strs.replace('f','i')
'ioo'
>>> strs  #original foo is still un-changed
'foo'

因此,最后您的代码实际上只替换了字符串.)中的jobLocationUnclean字符,并将其分配给jobLocationCleaned