Python: List (列表) 去重。

本文介绍几种有效的Python列表去重技巧,包括遍历查重插入、利用set集合特性及groupby函数结合排序实现去重,并确保保留元素首次出现的顺序。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1. 目标:

给定一个 list,去掉里面的重复元素,构成一个新的 list,返回一个新的 list。
例如:

Input list: a = [0, 1, 1, 2, 3, 4 ,4, 4, 5, 7, 7, 7, 7, 8, 8, 9 ]
Outpu list: b = [0, 1, 2, 3, 4, 5, 7, 8, 9] (顺序不作要求)

2. 方法:

完整代码结构如下:

def dedup(a):
    pass


def main():
    a = [0, 1, 1, 2, 3, 4, 4, 4, 5, 7, 7, 7, 7, 8, 8, 9]
    b = dedup(a)
    print(b)


if __name__ == '__main__':
    main()

我们现在需要设计我们的 dedup(a) 方法。

2.1 遍历查重插入:

思想:新建一个 list b,遍历原 list a, 并且检查b中是否有这个元素,如果没有则插入到 b 中,否则遍历 list 的下一位,知道遍历完 a。代码如下:

def dedup(a):
    b = []
    for i in a: #遍历 a
        if i not in b:  #检查是否不在 b 中
            b.append(i)
    return b

2.2 set(集合):

思想:set([iterable]): 接收一个可迭代的对象,返回一个新的 set(集合)。集合:无序的不重复元素序列,这样输入一个 list,返回的是一个对 list 去重之后所有元素构成的一个无序集合 set, 为了转回 list,可以使用 list 方法,将 set 转为 list。代码如下: 这个方法不保证顺序

def dedup(a):
    b = list(set(a))
    return b


def main():
    a = [1, 4, 3, 3, 4, 2, 3, 4, 5, 6, 1]
    b = dedup(a)
    print(b)


if __name__ == '__main__':
    main()

## 结果是: [1, 2, 3, 4, 5, 6],默认按照的从小到大的顺序,没有按照出现的顺序

改进:要求 b 按照 a 中出现的顺序

def dedup(a):
    b = list(set(a))
    b.sort(key=a.index)
    return b


def main():
    a = [1, 4, 3, 3, 4, 2, 3, 4, 5, 6, 1]
    b = dedup(a)
    print(b)


if __name__ == '__main__':
    main()

## 结果是: [1, 4, 3, 2, 5, 6]

2.3 itertools(集合):

itertools.groupby() 把迭代器中相邻的重复元素挑出来放在一起。因为相邻的重复元素才放在一起,因此,我们需要对 list 进行排序。代码如下: 我们需要先导入 itertools 模块;

import itertools
def dedup(a):
    b = []
    a.sort()
    it = itertools.groupby(a)
    for i, _ in it:
        b.append(i)
    return b

==注意: 我们先要用 sort(),对 a 进行排序,否则会出问题。==例如:

import itertools


def dedup(a):
    b = []
    it = itertools.groupby(a)
    for i, _ in it:
        b.append(i)
    return b


def main():
    a = [0, 1, 2, 1, 2]
    b = dedup(a)
    print(b)


if __name__ == '__main__':
    main()

## 返回结果: [0, 1, 2, 1, 2]
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值