python中对列表除重并排序

最近在练习python中遇见一道挺有意思的题目下面就分享给大家 题目如下:

有一个列表,里面有n个未知元素,其中可能存在重复的元素,让你编写一个算法除掉里面重复的元素并有序的输出各个元素及除掉的元素个数

这道题其实并不难,我们可以分三步完成

第一步需要对列表里面的元素进行除重操作,这里我们需要一个临时的列表,用于保存除重后的数据
第二步运用快速排序–归并排序–对除重元素进行排序操作
第三步运用Python中提供的切片,切掉多余的元素

全部代码如下:

#除重操作
def quchong(sum,a,b):

    for i in range(0, a.__len__()):
        x = 0
        for j in range(i + 1, a.__len__()):
            if a[i] == a[j]:
                x = x + 1
        sum[i] = x

    for k in range(0, a.__len__()):
        if sum[k] !=0:
            k=k+1
        else:
            b[k]=a[k]

    return b

#归并排序
def mergeSort(a):               #归并排序
    if len(a)<=1:               #如果是一个元素或者空元素
        return a
    mid=len(a)//2               #去中间位置
    left =mergeSort(a[:mid])    #归并左列表
    right=mergeSort(a[mid:])    #归并右列表
    return merge(left,right)    #返回

def merge(left,right):                          #合并两个列表
    merged=[]
    i,j=0,0                                     #i和j 分别作为left 和right的下标
    left_len,right_len=len(left),len(right)     #分别获取左右子列表的长度
    while i<left_len and j<right_len:           #循环归并左右子列表元素
        if left[i]<=right[j]:
            merged.append(left[i])              #归并左列表
            i+=1
        else:
            merged.append(right[j])             #归并右列表
            j+=1
    merged.extend(left[i:])                     #归并剩余左列表
    merged.extend(right[j:])                    #归并剩余有列表
   # print(left,right,merged)                    #跟踪调试
    return merged


def xiao(b):
    for i in range(0,b.__len__()):
        if b[i]==0:
            i=i+1
        else:
            return b[i:]
a=[1,2,3,4,5,6,7,8,9,1,3,4,5,8,10,11,1,11,111,1]
b=[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]
sum=[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]
x=0
quchong(sum,a,b)
b=mergeSort(b)
re=xiao(b)
print("除掉重复元素个数为:",a.__len__()-re.__len__())
print("除重并排序后的数据:",re)

















  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值