一尘不染

Python-在for循环中如何修改列表项?

python

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


阅读 307

收藏
2020-02-13

共2个答案

一尘不染

它被认为是不良形式。如果需要保留对列表的现有引用,请改用列表理解和切片分配。

a = [1, 3, 5]
b = a
a[:] = [x + 2 for x in a]
print(b)
2020-02-13
一尘不染

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

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]

尽管它确实需要更多的索引操作,但是它不需要创建临时列表和分配临时列表来替换原始列表。

注意:尽管你可以通过这种方式修改条目,但是你不能在不改变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 ']  # WRONG!

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

更新资料

由于这是一个相当受欢迎的答案,因此,这是如何“就地”有效删除条目的方法(即使这不是确切的问题):

b = ['a',' b', 'c ', ' d ']

b[:] = [entry for entry in b if entry.strip() == entry]

print(b)  # -> ['a']  # CORRECT
2020-02-13