如何在for循环中修改列表元素?

时间:2019-07-14 01:58:21

标签: python list loops

我正在尝试修改列表元素,并用新修改的元素替换原始元素。但是,我注意到所需的行为因我构造for循环的方式而异。例如:

samples = ['The cat sat on the mat.', 'The dog at my homework.']
punctuation = ['\'', '\"', '?', '!', ',', '.']

for sample in samples:
    sample = [character for character in sample if character not in punctuation]
    sample = ''.join(sample)

print(samples)

for i in range(len(samples)):
    samples[i] = [character for character in samples[i] if character not in punctuation]
    samples[i] = ''.join(samples[i])

print(samples)

该程序输出:

['The cat sat on the mat.', 'The dog at my homework.']
['The cat sat on the mat', 'The dog at my homework']

第二个for循环是从句子中删除标点符号的所需输出,但是我很难理解为什么会发生这种情况。我已经在线搜索过,发现this Quora answer有助于解释技术细节,但是我想知道是否不可能使用for循环的第一种方法来修改列表元素,以及是否必须诉诸使用函数例如rangeenumerate来修改循环中的列表元素。

谢谢。

3 个答案:

答案 0 :(得分:1)

修改迭代器是不够的,

您还需要修改列表:

答案 1 :(得分:1)

您需要替换列表中的项目,而不是更新由for循环创建的局部变量。一种选择是使用range并按索引更新。

for i in range(len(samples)):
    sample = [character for character in samples[i] if character not in punctuation]
    samples[i] = ''.join(sample)

也就是说,一种更pythonic的方法是使用理解。您还可以使用正则表达式库进行替换。

import re
clean_samples = [
    re.sub("['\"?!,.]", "", sample)
    for sample in samples
]

答案 2 :(得分:1)

尝试一下:

samples = ['The cat sat on the mat.', 'The dog at my homework.']
punctuation = ['\'', '\"', '?', '!', ',', '.']
new_sample = []

for sample in samples:
    sample = [character for character in sample if character not in punctuation]
    sample = ''.join(sample)
    new_sample.append(sample)
print(new_sample)

在这种情况下,sample是一个迭代器,而不是列表的元素,因此,当您尝试修改sample时,不会更新该元素。