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

发布于 2021-02-02 23:20:43

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

关注者
0
被浏览
194
1 个回答
  • 面试哥
    面试哥 2021-02-02
    为面试而生,有面试问题,就找面试哥。

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

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


  • 面试哥
    面试哥 2021-02-02
    为面试而生,有面试问题,就找面试哥。

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

    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
    


知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看