目录
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。