【问题标题】:Python: for-loop wrong output [duplicate]Python:for循环错误输出[重复]
【发布时间】:2016-10-05 21:01:59
【问题描述】:

不明白为什么它在循环中缺少一些索引? 例如索引号 3。 我只是想以这种方式删除独特的元素。我知道另一个,但我不知道这个(或我)有什么问题。

lst = [2, 7, 1, 9, 3, 5, 2, 1]

def check(lst):
    result = lst
    print(lst) #checking
    for num in lst:
        print("index:", num) #checking
        print("num:", num) #checking
        if lst.count(num) < 2:
            print("count:", lst.count(num)) #checking
            result.remove(num)
    return(result)

print(check(lst))

输出

[2, 7, 1, 9, 3, 5, 2, 1]
index: 2
num: 2
index: 7
num: 7
count: 1
index: 9
num: 9
count: 1
index: 5
num: 5
count: 1
index: 1
num: 1
[2, 1, 3, 2, 1]

【问题讨论】:

  • 在迭代列表时不要改变它!!!!
  • 我想你可能正在寻找enumerate()。此外,在迭代列表时不要改变列表。它会导致坏事、坏事......
  • 在迭代列表时,您正在从列表中删除元素。我不是 100% 确定,但我相信它会在删除过程中保持索引不变,这意味着如果索引指向第 4 号元素,而您删除第 4 号元素,则右侧的所有元素都会向左移动一个,然后索引递增,从而跳过一个元素。更好的方法是保留要删除的项目列表,然后在此循环后将其删除。
  • 谢谢大家!我忘了结果只是 lst 的镜像(不是副本)。

标签: python python-3.x loops for-loop output


【解决方案1】:

您正在从列表中删除项目因为您正在迭代它,这是您不应该这样做的。

result = lst 不会复制 lst;它会创建一个新的 name 来引用同一个对象。)

如果你只是想删除重复的元素,你可以使用set(虽然你可能会丢失你的排序):

lst = list(set(lst))

【讨论】:

  • 记下他是如何复制列表的不是一个好主意吗(result = lst[:])?
  • 这应该是评论而不是答案...
猜你喜欢
  • 2018-10-29
  • 1970-01-01
  • 1970-01-01
  • 2022-01-27
  • 2013-11-30
  • 2019-07-29
  • 1970-01-01
  • 2019-09-08
  • 1970-01-01
相关资源
最近更新 更多