我是 Python 新手,我的作业是获取一个包含一堆数字的列表,然后
- 按照从最低数字到最高数字的顺序排列列表
- 删除重复的数字。
这必须通过循环来完成
到目前为止我的代码:
numbers = [84, 79, 66, 69, 79, 82, 78, 79, 84, 84, 79, 66, 69, 84,
72, 65, 84, 73, 83, 84, 72, 69, 81, 85, 69, 83, 84, 73, 79, 78]
ordered = []
while numbers != []:
min = numbers[0]
for i in range(0, len(numbers)):
if numbers[i] < min:
min = numbers[i]
ordered.append(min)
j = 0
while j < len(numbers):
if numbers[j] == min:
numbers.pop(j)
j += 1
print(ordered)
输出:
[65, 66, 69, 72, 73, 78, 79, 79, 81, 82, 83, 84, 84, 84, 85]
所以任务 1 没问题,但任务 2 仅在某些时刻完成,而不是全部完成。 我不明白为什么? 预先感谢您的任何帮助! P.S.:我已经用另一种方式解决了这个问题,但它一直困扰着我,为什么我发布的这个想法不起作用。
最佳答案
其他人提供了更短、更有效的方法来做到这一点,但您具体询问了您的方法出了什么问题。问题出在这一点:
j = 0
while j < len(numbers):
if numbers[j] == min:
numbers.pop(j)
j += 1
如果 min
会发生什么连续出现两次?比如说min == 3
,列表为[1, 3, 3, 7]
.
- 对于
j == 0
,numbers[j] == 1
所以我们不弹出它,并增加j
. - 对于
j == 1
,numbers[j] == 3
所以我们删除元素1
和增量j
。现在的列表是[1, 3, 7]
. - 对于
j == 2
,numbers[j] == 7
所以我们不弹出它,我们就完成了。
哎呀!我们跳过了第二个 3
因为当我们弹出它的前一个位置时,它向后移动了一位,而 j
同时前进一位。
解决方案是仅增加 j
如果我们没有删除任何内容,因为我们需要重新检查位置 j
处的元素在我们删除其前身之后:
j = 0
while j < len(numbers):
if numbers[j] == min:
numbers.pop(j)
else:
j += 1
让我们验证一下循环是否仍能保证终止。每次迭代,要么 j
变大,或len(numbers)
变得更小,所以最终他们会相遇并 j < len(numbers)
变成假的。所以我们很好。
关于Python列表: how to make it ordered and get rid of duplicates,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64821377/