为了账号安全,请及时绑定邮箱和手机立即绑定

如何在for循环期间修改列表项?

如何在for循环期间修改列表项?

守着一只汪 2019-06-23 14:40:08
如何在for循环期间修改列表项?现在我知道在迭代循环期间修改列表是不安全的。但是,假设我有一个字符串列表,并且我希望去掉字符串本身。替换可变值是否意味着修改?
查看完整描述

3 回答

?
交互式爱情

TA贡献1712条经验 获得超3个赞

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


a = [1, 3, 5]

b = a

a[:] = [x + 2 for x in a]

print(b)


查看完整回答
反对 回复 2019-06-23
?
泛舟湖上清波郎朗

TA贡献1818条经验 获得超3个赞

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


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


查看完整回答
反对 回复 2019-06-23
?
慕尼黑5688855

TA贡献1848条经验 获得超2个赞

在我看来,还有一个for循环变体比一个枚举()更干净:

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


查看完整回答
反对 回复 2019-06-23
  • 3 回答
  • 0 关注
  • 753 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号