本文目录导读:

在Python中实现列表去重有多种方法,下面我来介绍几种常见且实用的方式:
使用set(最简单,但会打乱顺序)
# 原始列表 my_list = [1, 2, 2, 3, 4, 4, 5, 1, 6] # 使用set去重 unique_list = list(set(my_list)) print(unique_list) # 输出: [1, 2, 3, 4, 5, 6](顺序可能不同)
保持原顺序的去重方法
使用for循环和辅助列表
def remove_duplicates_keep_order(items):
unique_list = []
for item in items:
if item not in unique_list:
unique_list.append(item)
return unique_list
my_list = [1, 2, 2, 3, 4, 4, 5, 1, 6]
result = remove_duplicates_keep_order(my_list)
print(result) # 输出: [1, 2, 3, 4, 5, 6]
使用字典(Python 3.7+ 保持插入顺序)
my_list = [1, 2, 2, 3, 4, 4, 5, 1, 6] unique_list = list(dict.fromkeys(my_list)) print(unique_list) # 输出: [1, 2, 3, 4, 5, 6]
处理复杂数据类型
列表中有字典的情况
# 包含字典的列表
data = [
{'name': 'Alice', 'age': 25},
{'name': 'Bob', 'age': 30},
{'name': 'Alice', 'age': 25},
{'name': 'Charlie', 'age': 35}
]
# 方法1: 使用JSON序列化(简单但有限制)
import json
unique_data = list({json.dumps(d, sort_keys=True): d for d in data}.values())
print(unique_data)
# 方法2: 自定义去重函数
def remove_duplicate_dicts(data_list):
seen = set()
result = []
for d in data_list:
# 将字典转换为可哈希的元组
dict_tuple = tuple(sorted(d.items()))
if dict_tuple not in seen:
seen.add(dict_tuple)
result.append(d)
return result
unique_data = remove_duplicate_dicts(data)
print(unique_data)
针对特定场景的方法
字符串列表去重(忽略大小写)
fruits = ['Apple', 'apple', 'Banana', 'banana', 'Cherry']
# 不区分大小写去重
unique_fruits = list({fruit.lower(): fruit for fruit in fruits}.values())
print(unique_fruits) # 输出: ['apple', 'banana', 'Cherry']
基于某个属性去重(对象列表)
class Person:
def __init__(self, name, age):
self.name = name
self.age = age
def __repr__(self):
return f"Person({self.name}, {self.age})"
people = [
Person('Alice', 25),
Person('Bob', 30),
Person('Alice', 25),
Person('Charlie', 35)
]
# 基于name属性去重
seen_names = set()
unique_people = []
for person in people:
if person.name not in seen_names:
seen_names.add(person.name)
unique_people.append(person)
print(unique_people) # 输出: [Person(Alice, 25), Person(Bob, 30), Person(Charlie, 35)]
使用第三方库(pandas)
# 需要安装pandas: pip install pandas import pandas as pd my_list = [1, 2, 2, 3, 4, 4, 5, 1, 6] unique_list = pd.Series(my_list).drop_duplicates().tolist() print(unique_list) # 输出: [1, 2, 3, 4, 5, 6]
性能对比
import time
import random
# 生成测试数据
test_list = [random.randint(1, 1000) for _ in range(10000)]
# 测试不同方法
start = time.time()
list(set(test_list))
print(f"set方法: {time.time() - start:.4f}秒")
start = time.time()
list(dict.fromkeys(test_list))
print(f"dict方法: {time.time() - start:.4f}秒")
start = time.time()
result = []
for item in test_list:
if item not in result:
result.append(item)
print(f"for循环方法: {time.time() - start:.4f}秒")
推荐使用场景
- 数据量大且不关心顺序:使用
set() - 需要保持顺序:使用
dict.fromkeys()或手动循环 - 处理复杂数据结构:根据具体需求自定义去重逻辑
- 数据分析场景:考虑使用pandas
选择哪种方法取决于你的具体需求:是否需要保持顺序、数据类型是否简单、性能要求如何等因素。