现在我知道在迭代循环期间修改列表是不安全的。但是,假设我有一个字符串列表,我想剥离字符串本身。替换可变值算作修改吗?


相关问题请参见for循环中python变量的作用域:给迭代变量赋值不会修改底层序列,也不会影响未来的迭代。


当前回答

从你的问题中不清楚决定删除哪些字符串的标准是什么,但如果你有或可以列出你想删除的字符串,你可以做以下工作:

my_strings = ['a','b','c','d','e']
undesirable_strings = ['b','d']
for undesirable_string in undesirable_strings:
    for i in range(my_strings.count(undesirable_string)):
        my_strings.remove(undesirable_string)

my_strings变为['a', 'c', 'e']

其他回答

这被认为是糟糕的形式。如果需要保留对列表的现有引用,则使用列表理解式,并使用切片赋值。

a = [1, 3, 5]
b = a
a[:] = [x + 2 for x in a]
print(b)

从你的问题中不清楚决定删除哪些字符串的标准是什么,但如果你有或可以列出你想删除的字符串,你可以做以下工作:

my_strings = ['a','b','c','d','e']
undesirable_strings = ['b','d']
for undesirable_string in undesirable_strings:
    for i in range(my_strings.count(undesirable_string)):
        my_strings.remove(undesirable_string)

my_strings变为['a', 'c', 'e']

多一个for循环变量,对我来说看起来比使用enumerate()更干净:

for idx in range(len(list)):
    list[idx]=... # set a new value
    # some other code which doesn't let you use a list comprehension

我刚刚发现的一些东西-当循环遍历一个可变类型列表(比如字典)时,你可以使用一个正常的for循环,像这样:

l = [{"n": 1}, {"n": 2}]
for d in l:
    d["n"] += 1
print(l)
# prints [{"n": 2}, {"n": 1}]

在迭代列表时修改每个元素是可以的,只要不更改列表中的添加/删除元素。

你可以使用列表推导式:

l = ['a', ' list', 'of ', ' string ']
l = [item.strip() for item in l]

或者只做c风格的for循环:

for index, item in enumerate(l):
    l[index] = item.strip()