当前位置: 首页 > 面试题库 >

Python-从列表中删除项-在迭代过程中-这个习惯用法有什么问题?

茅炯
2023-03-14
问题内容

作为实验,我这样做:

letters=['a','b','c','d','e','f','g','h','i','j','k','l']
for i in letters:
    letters.remove(i)
print letters

最后打印显示不是所有项目都被删除了吗?(其他所有人)。

IDLE 2.6.2      
>>> ================================ RESTART ================================
>>> 
['b', 'd', 'f', 'h', 'j', 'l']
>>> 

这有什么解释?如何将其重写以删除所有项目?


问题答案:

这是什么原因呢?

因为Python语言被设计为以不同方式处理此用例。该文档明确指出:

循环中修改要迭代的序列是不安全的(这仅适用于可变序列类型,例如列表)。如果你需要修改要遍历的列表(例如,复制选定的项目),则必须遍历一个副本。

强调我的。有关更多信息,请参见链接的页面-文档受版权保护,并保留所有权利。

你可以很容易地理解为什么得到了你想要的东西,但是基本上这是未定义的行为,可以很容易地更改,而不会因构建而异。只是不要这样做。

这就像想知道为什么i += i++ + ++i在针对你的语言的特定编译器版本中,该行在你的体系结构上所做的事情到底是怎么回事 -包括但不限于破坏计算机并让恶魔从你的鼻子里飞出来 :)

如何将其重写以删除所有项目?
- del letters[:](如果你需要更改对此对象的所有引用)
- letters[:] = [] (如果你需要更改对此对象的所有引用)
- letters = [] (如果你只想使用一个新对象)
也许你只是想根据条件删除一些物品?在这种情况下,你应该遍历列表的副本。制作副本的最简单方法是使用如下[:]语法制作包含整个列表的切片:


#remove unsafe commands
commands = ["ls", "cd", "rm -rf /"]
for cmd in commands[:]:
  if "rm " in cmd:
    commands.remove(cmd)

如果你的检查不是特别复杂,则可以(可能应该)过滤:

commands = [cmd for cmd in commands if not is_malicious(cmd)]


 类似资料:
  • 问题内容: 作为实验,我这样做: 最后打印显示不是所有项目都被删除了吗?(其他所有人)。 这有什么解释?如何将其重写以删除每个项目? 问题答案: 一些答案解释了为什么会发生这种情况,而另一些则解释了您应该做什么。我会毫不掩饰地拼凑在一起。 这是什么原因? 因为Python语言被设计为以不同方式处理此用例。该文档明确指出: 在循环中修改要迭代的序列是不安全的(这仅适用于可变序列类型,例如列表)。 如

  • 问题内容: Python如何在迭代时从列表中删除项目? 问题答案: 你可以使用列表推导来创建一个仅包含你不想删除的元素的新列表: 或者,通过分配给,你可以将现有列表突变为仅包含所需的项目: 如果还有其他引用somelist需要反映更改,则此方法可能很有用。 除了理解之外,你还可以使用itertools。在Python 2中: 或在Python 3中:

  • 问题内容: 假设我有一个数字列表: 迭代时,如何从列表中删除元素(例如3)? 我尝试了以下代码,但没有成功: 有任何想法吗? 谢谢,博达·西多(Boda Cydo)。 问题答案: 最好的方法通常是建设性地进行-建立所需项目的新列表,而不要删除不需要的项目。例如: 列表理解建立所需的列表,并分配到“全名单切片” ,确保你 不 只是一个重新绑定的名字,但完全替换 内容 ,所以影响是恒等于你想要的“清除

  • 本文向大家介绍在Python中迭代时从字典中删除项目,包括了在Python中迭代时从字典中删除项目的使用技巧和注意事项,需要的朋友参考一下 python字典是无序,可变和索引的集合。它们具有键和值,并且使用键来引用每个项目。在本文中,我们将探讨从字典中删除项目的方法。 与键一起使用del 在这种方法中,我们捕获了需要删除的键值。一旦应用了del函数,这些键的键值对就会被删除。 示例 输出结果 运行

  • 问题内容: 如果想基于每个嵌套列表的第一个元素评估重复项,谁能提出一个好的解决方案从嵌套列表中删除重复项? 主列表如下所示: 如果已经在第一位置出现了另一个具有相同元素的列表,那么我想删除该列表并得到以下结果: 您可以建议一种算法来实现此目标吗? 问题答案: 您是否关心保留订单/删除了哪些重复项?如果不是,则: 会做的。如果您想保留订单并想保留第一个订单,则:

  • 我有以下代码: 我试图遍历列表中的每个对象,根据条件删除一个项目,并保持循环,直到所有项目都被删除。 当我在intellij中运行这个时,我得到了以下错误: 我搜索了这个问题,找到了这个解决方案。在此处输入链接描述 当我更改代码时,它变成了: 但是,现在我收到以下错误: 我找到了这个错误的答案,但老实说,它并没有为我澄清任何事情。我如何才能从列表中删除该对象?