目录

Python 中的列表 (List) 类型是允许有重复项的,有没有办法移除列表中的重复项呢?本文介绍三种方法:

  • 循环去重
  • 集合去重
  • itertools 库去重

1. 循环去重

循环去重是通过 for 循环遍历列表中的所有元素,并引入一个新的列表对象帮助去重。

代码

# 定义一个含有重复项的列表
a_list = [1,3,9,7,9,6]

result_list = []

for item in a_list:
    if item not in result_list:
        result_list.append(item)
    else:
        continue

print(result_list)

输出结果

[1, 3, 9, 7, 6]

从输出结果可看出,重复的 9 已经被移除掉了。

2. 集合去重

与列表类型不同,Python 中的集合 (Set) 类型是不允许有重复项的,利用这一特点,可以利用集合帮助去除列表中的重复项。

注意

集合去重法输出的列表与源列表相比有一个不同:元素的顺序不同。

代码

# 定义一个含有重复项的列表
a_list = [1,3,9,7,9,6]

result_list = list(set(a_list))

print(result_list)

输出结果

[1, 3, 6, 7, 9]

从输出结果可以看出重复的 9 被移除,元素的顺序也按某种顺序进行了排序。

3. itertools 库去重

Python 的 itertools 库中有一个 groupby 方法,它可以将列表中相邻的重复元素去掉,因此对列表先排序,再使用 groupby 方法就可以去除列表中的重复元素。

注意

由于对列表进行了排序,因此输出列表中元素的顺序与源列表相比可能不相同。

代码

# 定义一个含有重复项的列表
from itertools import groupby

a_list = [1,3,9,7,7,9,6]

result_list = ([i[0] for i in groupby(sorted(a_list))])

print(result_list)

输出结果

[1, 3, 6, 7, 9]

从输出结果可以看出重复的 9 被移除,元素的顺序也进行了排序。

4. 性能比较

下面使用 timeit 库测试一下循环去重法、集合去重法、itertools 库去重法的性能,看看谁更快一些。

测试代码

import timeit

setup = """
from itertools import groupby
a_list = [1,3,9,7,9,6]
"""

method_1_test_code = """
result_list = []
for item in a_list:
    if item not in result_list:           
        result_list.append(item) 
    else: 
        continue
"""

method_2_test_code = """
result_list = list(set(a_list))
"""

method_3_test_code = """
result_list = ([i[0] for i in groupby(sorted(a_list))])
"""

method_1_taking_time = timeit.timeit(stmt=method_1_test_code, setup=setup, number=100)

method_2_taking_time = timeit.timeit(stmt=method_2_test_code, setup=setup, number=100)

method_3_taking_time = timeit.timeit(stmt=method_3_test_code, setup=setup, number=100)

print('循环去重耗时: ' + str(method_1_taking_time))

print('集合去重耗时: ' + str(method_2_taking_time))

print('itertools 库去重耗时: ' + str(method_3_taking_time))

测试结果

循环去重耗时: 3.130000550299883e-05
集合去重耗时: 2.5399960577487946e-05
itertools 库去重耗时: 6.660004146397114e-05

从测试结果可以看出:集合去重法的性能最好。

有关 Python 代码运行速度的测试方法可参见我的文章:如何测试 Python 代码的速度 - datetime, timeit

官方公众号

💯本站文章同步发表在官方公众号 ReadingHere,关注公众号您将在第一时间了解本站最新文章和资讯。

❤️欢迎您关注本站官方公众号 ReadingHere


版权声明

本文由ReadingHere原创,未经ReadingHere授权不得转载、摘编。已经授权使用的,应在授权范围内使用,并注明来源: www.readinghere.com。违反上述声明者,ReadingHere将追究其相关法律责任。


交流合作

如需交流咨询或商务合作请扫描下图微信二维码联系。