繁体   English   中英

Python 列表:如何使其有序并消除重复项

[英]Python list: how to make it ordered and get rid of duplicates

我是 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]

所以 task1 没问题,但 task2 只在某些时候完成,而不是全部。 我想不通为什么? 预先感谢您的任何帮助! PS:我已经以另一种方式解决了这个问题,但它一直困扰着我,为什么我发布的这个想法不起作用。

其他人提供了更短、更有效的方法,但您具体询问了您的方法出了什么问题。 问题出在这一点上:

    j = 0
    while j < len(numbers):
        if numbers[j] == min:
            numbers.pop(j)
        j += 1

如果min背靠背出现两次会发生什么? 例如,假设min == 3 ,并且列表是[1, 3, 3, 7]

  • 对于j == 0numbers[j] == 1所以我们不会弹出它,并增加j
  • 对于j == 1numbers[j] == 3所以我们删除元素1并增加j 列表现在是[1, 3, 7]
  • 对于j == 2numbers[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)变为 false。 所以我们很好。

你可以使用冒泡排序。(如果你需要其他排序方法,只需替换它)

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]

def bubble_sort(arr):
    n = len(arr)
    for i in range(n-1):
        for j in range(0, n-i-1):
            if arr[j] > arr[j+1] :
                arr[j], arr[j+1] = arr[j+1], arr[j]
    no_dub = []
    for i in arr:
        if i not in no_dub:
            no_dub.append(i)
    return no_dub
bubble_sort(numbers)

结果:

[65, 66, 69, 72, 73, 78, 79, 81, 82, 83, 84, 85]

你需要一个小的补充:

    while j < len(numbers):
    if numbers[j] == min:
        numbers.pop(j)
        j -= 1             #increment should not advance if you pop a number
    j += 1

然后它会工作

set将删除重复项

sorted将对其进行排序

sorted(list(set([65, 66, 69, 72, 73, 78, 79, 79, 81, 82, 83, 84, 84, 84, 85])))
[65, 66, 69, 72, 73, 78, 79, 81, 82, 83, 84, 85]

暂无
暂无

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

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