【问题标题】:How to update loop variable with range function? [duplicate]如何使用范围函数更新循环变量? [复制]
【发布时间】:2020-10-13 06:04:07
【问题描述】:

我想从列表中删除重复项。我知道使用list(dict.fromkeys(my list)) 可以轻松完成,但我想通过遍历列表来完成。当我从列表中删除重复数字时,循环变量j 会在后续迭代中导致Index error : list index out of range,即使我正在更改范围输入。我想知道如何更改循环内的循环变量?

def rem_duplicate(seq):
    for i in range(len(seq)):
        num = seq[i]
        count = 0
        length = len(seq)
        for j in range(length):
            if seq[j] == num:
                count += 1
                if count > 1:
                    del seq[j]
                    length=length-1
    return seq

my_list = [2, 3, 4, 5, 6, 7, 8, 3, 4, 1, 5, 2, 5, 7, 9]

print(rem_duplicate(my_list))

【问题讨论】:

  • 尤其是这个答案:stackoverflow.com/a/42773232/895932 使用了一个 while 循环。
  • 你可以直接使用 set(my_list) 或者迭代你可以使用 while 循环来代替
  • 您在for 循环内更改length 变量没有任何作用。循环已经用length的原始值初始化,不会更新。
  • 在遍历它的同时改变这样的列表是一场噩梦,当你删除一个元素时你的循环计数器变得不正确,更好的方法是过滤掉你不想要的元素并使用上面链接的列表理解在另一个列表中累积。
  • 列表推导不能用于删除重复项,因为它无法访问其他元素,因此我建议在该重复目标问题中使用 while 循环的答案,这适用于这种情况。

标签: python list


【解决方案1】:

当您进入内部循环时,将调用 range() 函数并使用当前长度值,例如 3。因此,您的循环看起来像 for j in [1, 2, 3] 并且更改 length 不会影响更改提到的列表.

为了实现您想要的,以及在改变您正在迭代的列表的大小时,最好使用while 循环:

j = 0
while j < length:
  if seq[j] == num:
    count += 1
    if count > 1:
      del seq[j]
      length=length-1
  j += 1

【讨论】:

  • 非常感谢。尽管我不得不将外部循环也更改为 while 循环,但它仍然有效。返回不可变序列的范围是有意义的。
【解决方案2】:

范围(len(seq))

将返回一个不可变的序列,不受对原始列表的 add / del 操作的影响。 看看之前对同一问题的回答(使用一段时间):Python: remove duplicate items from a list while iterating

【讨论】:

    猜你喜欢
    • 2012-07-07
    • 2014-11-10
    • 1970-01-01
    • 2013-11-29
    • 1970-01-01
    • 2023-03-04
    • 2013-08-30
    • 1970-01-01
    相关资源
    最近更新 更多