Python For循环迭代似乎跳过了列表中的两个数字

Python For循环迭代似乎跳过了列表中的两个数字,python,python-3.x,Python,Python 3.x,当运行下面的代码时,我不明白为什么它不删除所有1?它保留了其中两个,在if语句之前添加了我的两个print语句,它显示程序似乎跳过了4个1中的最后2个。我知道一种更简单的方法,我只是想理解为什么这不起作用的逻辑 numbers3 = [1, 1, 1, 1, 4, 5, 7, 7, 9] print(numbers3.count(1)) for number in numbers3: print(numbers3.count(number)) print(number)

当运行下面的代码时,我不明白为什么它不删除所有1?它保留了其中两个,在if语句之前添加了我的两个print语句,它显示程序似乎跳过了4个1中的最后2个。我知道一种更简单的方法,我只是想理解为什么这不起作用的逻辑

numbers3 = [1, 1, 1, 1, 4, 5, 7, 7, 9]
print(numbers3.count(1))

for number in numbers3:
    print(numbers3.count(number))
    print(number)
    if numbers3.count(number) > 1:
        numbers3.remove(number)
print(numbers3)
我预计结果是[1,4,5,7,9] 但我得到的是[1,1,4,5,7,9]


欢迎来到Stackoverflow

问题是您正在修改正在迭代的列表,这在Python(或大多数其他语言)中很少能获得令人满意的结果

初学者经常会问一些有用的问题,告诉我们预期的输出是什么,但不告诉我们为什么。阅读您的代码,我推断(或者更准确地说是猜测)您想要一个包含每个唯一数字的单个副本的列表

实现目标的一种方法是建立一个单独的数字列表。因此,这(未经测试)应该有效:

result = []
for number in numbers3:
    if number not in result:
        result.append(number)
一种更简单的方法是

result = list(set(numbers3))

欢迎来到Stackoverflow

问题是您正在修改正在迭代的列表,这在Python(或大多数其他语言)中很少能获得令人满意的结果

初学者经常会问一些有用的问题,告诉我们预期的输出是什么,但不告诉我们为什么。阅读您的代码,我推断(或者更准确地说是猜测)您想要一个包含每个唯一数字的单个副本的列表

实现目标的一种方法是建立一个单独的数字列表。因此,这(未经测试)应该有效:

result = []
for number in numbers3:
    if number not in result:
        result.append(number)
一种更简单的方法是

result = list(set(numbers3))

这是因为您正在从列表中删除,同时对其进行迭代。删除[1,1],然后4成为第2个索引,它跳过另一个[1,1]。

这是因为您正在从列表中删除,同时对其进行迭代。您删除[1,1],然后4成为第2个索引,它跳过另一个[1,1]。

谢谢,这确实是我想要的结果,您的代码是正确的(这是我在做的练习中的答案。因此,在将来,避免修改正在迭代的同一个列表通常是一个好主意?相反,根据应用于原始列表的逻辑创建一个新列表是一个更好的主意。再次感谢。这是正确的。一般来说,在Python中,我们倾向于创建新对象通过迭代现有的名称。如果不再需要输入,我们通常会对结果使用相同的名称,但我觉得这可能有点太混乱。重新使用名称意味着输入占用的存储可以立即释放,但这通常是一个次要的考虑。而且,我忘了说,除非您特别需要一个列表,否则since Python 3.6(?)如果您只想在集合上迭代,
set(numbers3)
轻松获胜!谢谢,这确实是我想要的结果,您的代码是正确的(这是我在做的练习中的答案。因此,在将来,避免修改正在迭代的同一个列表通常是一个好主意?相反,根据应用于原始列表的逻辑创建一个新列表是一个更好的主意。再次感谢。这是正确的。一般来说,在Python中,我们倾向于创建新对象通过迭代现有的名称。如果不再需要输入,我们通常会对结果使用相同的名称,但我觉得这可能有点太混乱。重新使用名称意味着输入占用的存储可以立即释放,但这通常是一个次要的考虑。而且,我忘了说,除非您特别需要一个列表,否则since Python3.6(?)如果您只想在集合上迭代,
set(numbers3)
轻松获胜!