繁体   English   中英

内部while循环没有被执行

[英]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)

您的代码不会使ji+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)

它没有达到,因为ji从 0 值开始,并且在内部 while 循环中,条件是j in range(i+1, k)这意味着range(1, 4)0 in range(1, 4)会是False的。 无论如何,您应该避免使用ji作为计数器,而是使用for循环。

但解决方案更简单,不需要遍历列表,如果要删除重复值,可以执行以下操作:

numbers = [1, 6, 6, 7]
print(list(set(numbers)))

结果是: [1, 6, 7]

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM