Python列表: how to make it ordered and get rid of duplicates

标签 python list

我是 Python 新手,我的作业是获取一个包含一堆数字的列表,然后

  1. 按照从最低数字到最高数字的顺序排列列表
  2. 删除重复的数字。

这必须通过循环来完成

到目前为止我的代码:

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/

相关文章:

python - 如何在 tkinter Canvas 中嵌入 matplotlib 图形时获得 (3d) 交互性

python - 用 Popen 控制 puttygen

python - 从 python 字典更新文本文件

python - 连接列表 : Python 的元素

R-使用覆盖和递归合并列表

python - 返回范围内一组数字的所有最小公倍数

javascript - Python Flask 没有收到 AJAX 帖子?

python - 使用 mingw 安装任何东西时,使用 Python 3.x 的 Pip 或 easy_install 会爆炸

python - 如何将字符串列表更改为 float 列表

python - 为梯度直方图获取 0 到 180 之间无符号角度的正确方法