如何在for循环中修改列表条目?

现在我知道在迭代循环中修改列表是不安全的。 但是,假设我有一个string列表,我想自己去除string。 可变值的replace算作修改吗?

这被认为是可怜的forms。 如果您需要保留对列表的现有引用,请使用列表理解来代替切片分配。

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

由于下面的循环只修改已经看到的元素,所以可以接受:

 a = ['a',' b', 'c ', ' d '] for i, s in enumerate(a): a[i] = s.strip() print(a) # -> ['a', 'b', 'c', 'd'] 

与以下不同:

 a[:] = [s.strip() for s in a] 

因为它不需要创build一个临时列表和分配它来replace原来的列表,尽pipe它确实需要更多的索引操作。

小心:尽pipe您可以用这种方式修改条目,但是不能更改list的条目数量而不冒险遇到问题的机会。

下面是一个例子,我的意思是从这一点删除一个条目索引:

 b = ['a',' b', 'c ', ' d '] for i, s in enumerate(b): if s.strip() != b[i]: # leading or trailing whitespace? del b[i] print(b) # -> ['a', 'c '] 

(结果是错误的,因为它没有删除它应该有的所有项目。)

另外一个循环变体,比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 

不,你不会改变列表的“内容”,如果你可以这样改变string。 但在Python中,它们是不可变的。 任何string操作都会返回一个新字符

如果你有一个你知道可变的对象列表,只要你不改变列表的实际内容,就可以这样做。

因此,您需要制作某种地图。 如果你使用了一个生成器expression式,那么[操作]将在你迭代的时候完成,你将会节省内存。

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

你可以使用列表理解:

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

或者只是做C-style的循环:

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

你可以做这样的事情:

 a = [1,2,3,4,5] b = [i**2 for i in a] 

这就是所谓的列表理解,让你更容易在列表中循环。

从您的问题中不清楚决定删除哪些string的标准,但是如果您有或可以创build要删除的string的列表,则可以执行以下操作:

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