![](/img/trans.png)
[英]Why doesn't this python function get executed twice in a while loop?
[英]Inner while loop doesn't get executed
发现控件永远不会到达此代码段中的内部while循环以删除重复数字
numbers=[1,6,6,7]
k=len(numbers)
i=0
j=0
while i in range(k-1):
while j in range(i+1,k):
if numbers[i] == numbers[j]:
numbers.remove(numbers[j])
k-=1
j-=1
j += 1
i += 1
print(numbers)
您的代码不会使j
从i+1
开始。 相反,它从零开始,永远不会改变。 内部循环永远不会运行,因为0
超出了您正在测试的范围。
试试这个简单的改变:
i=0
while i < k+1:
j=i+1
while j < k:
if numbers[i] == numbers[j]:
...
主要变化是将j
的初始化移动到第一个while
循环中,因此每次您通过它 go 时它都会更新,并且从不小于或等于i
开始。
我所做的另一项更改不那么重要。 而不是使用i in range(...)
和j in range(...)
作为while
循环条件,我只是做了一个不等式测试。 这与range
成员测试在幕后所做的完全相同,但避免了对不可能发生的事情进行不必要的测试(比如现在j
太小了)。 它还使循环看起来不像for
循环,它大量使用for i in range(...)
语法(具有不同的含义)。
稍后您可能会遇到的另一个问题是,有些集合具有多组重复项,即您删除第j
个元素的代码可能没有达到您的预期。 调用numbers.remove(numbers[j])
从列表中删除等于numbers[j]
的第一个值,这将是索引i
处的值,而不是索引j
处的值。 要按索引删除列表项,您需要使用del numbers[j]
。
您可以使用dict.fromkeys()
从 Python 中的列表中删除重复项。
numbers=[1,6,6,7]
final_numbers = list(dict.fromkeys(numbers))
print(final_numbers)
在此示例中,我们使用dict.fromkeys()
方法从numbers
变量创建字典。 然后我们使用list()
将我们的数据从字典转换回列表。 然后,在最后一行,我们打印出修改后的列表。
另一种选择是使用set
。 Sets
用于存储 Python 中唯一项目的 collections。 与lists
不同, sets
不能存储重复值。 我们可以将我们的列表转换为一个集合以删除重复的项目。
numbers=[1,6,6,7]
final_numbers = list(set(numbers))
print(final_numbers)
它没有达到,因为j
和i
从 0 值开始,并且在内部 while 循环中,条件是j in range(i+1, k)
这意味着range(1, 4)
和0 in range(1, 4)
会是False
的。 无论如何,您应该避免使用j
和i
作为计数器,而是使用for
循环。
但解决方案更简单,不需要遍历列表,如果要删除重复值,可以执行以下操作:
numbers = [1, 6, 6, 7]
print(list(set(numbers)))
结果是: [1, 6, 7]
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.