【问题标题】:Removing list element while iterating in python3在python3中迭代时删除列表元素
【发布时间】:2016-11-21 09:06:39
【问题描述】:

我试图在遍历列表时删除列表元素(数值)。我有两个例子。示例 1 有效,但示例 2 无效,即使两个示例使用相同的逻辑。

示例 1:工作

list1=["5","a","6","c","f","9","r"]
print(list1)
for i in list1:
    if str.isnumeric(i):
    list1.remove(i)
print(list1)

示例 2:不工作

list2=["12abc1","45asd"]
for items in list2:
    item_list=list(items)
    print(item_list)
    for i in item_list:
        if str.isnumeric(i):
            item_list.remove(i)
    print(item_list)

我通过使用 (for i in item_list[:]:) 解决了示例 2。但我无法理解为什么第二个示例首先不起作用的逻辑?

【问题讨论】:

  • 您确定示例 1 工作正常吗?我说是因为方法 isnumeric() 没有参数。
  • 它有效。 str.isnumeric() 可以带参数

标签: python-3.x


【解决方案1】:

我不能声称自己是 Python 方面的专家,因为我对它的了解不多,但我会解释一下我认为可能发生的事情。

第一个示例实际上并没有比第二个示例更好,但是您用来测试它的数据不同,因此不会显示。问题似乎是由于您同时迭代任何修改,因此在第二个示例中发生以下情况:

  • 程序将遍历给定的列表:

    [“1”、“2”、“a”、“b”、“c”、“1”]

  • 程序从列表项 1 开始。它是数字的,因此被删除。列表现在不同了:

    [“2”、“a”、“b”、“c”、“1”]

  • 当您进行迭代时,它会移动到列表项 2。这是有问题的,因为列表项 2 是“a”而不是“2”,因此它会跳过“2”。

由于第一个示例中的数字由至少一个列表项分隔,因此这不是问题,因为所有数字都已迭代。

至于你提到的将 list2 更改为 list2[:] 的修复,我不知道那里发生了什么,因为当我通过 PythonTutor 的可视化工具运行程序时,它似乎不起作用。

为了解决这个问题,对我来说最明显的解决方案是尝试向后遍历数组 - 从最终列表项开始并移向列表的开头,因为这意味着您删除的任何项目都不会影响前几项的编号。

希望我能帮上忙!

【讨论】:

  • 好吧,我错了!!它应该是(对于 i in item_list[:]: )。第二个循环应该改变而不是第一个。
  • 你说得对,示例 1 在列表中连续数字时也不起作用(例如:list1=["5","6","a","7","c"," f","9","r"])
  • 哦,对了。使用 PythonTutor 运行另一个测试,似乎将 [:] 放入纠正了此错误。搜索后,我找到了这个答案stackoverflow.com/questions/6167238/what-does-in-python-mean,它解释了这种用法会创建列表的副本,因此当使用 for 循环对其进行迭代时,它仍会迭代所有值,因为您尚未从中删除值正在使用的列表副本,而不是来自原始列表。这应该意味着将 [:] 放在示例 1 中将修复该示例。
猜你喜欢
  • 2018-07-18
  • 2013-01-23
  • 1970-01-01
  • 2016-07-19
  • 2011-04-02
  • 2015-06-30
  • 2020-11-25
  • 2010-12-07
相关资源
最近更新 更多