本文目录导读:

在Python中实现数据去重有多种方法,下面我为你介绍几种常见且实用的案例:
列表去重
使用set(最简单)
# 基础列表去重
data = [1, 2, 2, 3, 4, 4, 5, 6, 6, 7]
unique_data = list(set(data))
print(f"去重前: {data}")
print(f"去重后: {unique_data}")
# 输出: 去重前: [1, 2, 2, 3, 4, 4, 5, 6, 6, 7]
# 输出: 去重后: [1, 2, 3, 4, 5, 6, 7]
保持顺序去重
# 保持原始顺序的去重
def remove_duplicates_keep_order(data):
seen = set()
result = []
for item in data:
if item not in seen:
seen.add(item)
result.append(item)
return result
data = [3, 1, 2, 1, 3, 4, 2, 5]
unique_data = remove_duplicates_keep_order(data)
print(f"保持顺序去重: {unique_data}")
# 输出: [3, 1, 2, 4, 5]
字典去重(根据key)
# 根据字典中的某个字段去重
data = [
{"id": 1, "name": "张三", "age": 25},
{"id": 2, "name": "李四", "age": 30},
{"id": 3, "name": "张三", "age": 28}, # 名字重复
{"id": 4, "name": "王五", "age": 35},
{"id": 5, "name": "张三", "age": 25}, # 完全重复
]
# 根据name字段去重,保留第一个出现的
unique_data = {}
for item in data:
if item["name"] not in unique_data:
unique_data[item["name"]] = item
result = list(unique_data.values())
print("根据name去重后的数据:")
for item in result:
print(item)
使用pandas去重(处理结构化数据)
import pandas as pd
# 创建DataFrame
df = pd.DataFrame({
'id': [1, 2, 3, 4, 5, 1, 2],
'name': ['Alice', 'Bob', 'Charlie', 'David', 'Eve', 'Alice', 'Bob'],
'score': [85, 92, 78, 95, 88, 85, 92]
})
print("原始数据:")
print(df)
# 根据所有列去重
df_unique = df.drop_duplicates()
print("\n完全去重后:")
print(df_unique)
# 根据指定列去重
df_unique_name = df.drop_duplicates(subset=['name'])
print("\n根据name去重:")
print(df_unique_name)
# 保留最后一个重复项
df_unique_last = df.drop_duplicates(keep='last')
print("\n保留最后一个重复项:")
print(df_unique_last)
复杂对象去重
class Person:
def __init__(self, name, age):
self.name = name
self.age = age
def __eq__(self, other):
if isinstance(other, Person):
return self.name == other.name and self.age == other.age
return False
def __hash__(self):
return hash((self.name, self.age))
def __repr__(self):
return f"Person(name='{self.name}', age={self.age})"
# 创建Person对象列表
people = [
Person("Alice", 25),
Person("Bob", 30),
Person("Alice", 25), # 重复
Person("Charlie", 35),
Person("Bob", 30) # 重复
]
# 使用set去重
unique_people = list(set(people))
print("去重后的人员列表:")
for person in unique_people:
print(person)
文件数据去重
# 从文件中读取数据并去重
def deduplicate_file(input_file, output_file):
seen_lines = set()
with open(input_file, 'r', encoding='utf-8') as infile:
with open(output_file, 'w', encoding='utf-8') as outfile:
for line in infile:
line_stripped = line.strip()
if line_stripped not in seen_lines:
seen_lines.add(line_stripped)
outfile.write(line)
print(f"去重完成!原始行数: X, 去重后行数: {len(seen_lines)}")
return len(seen_lines)
# 使用示例
# deduplicate_file('input.txt', 'output.txt')
自定义去重条件
# 自定义去重规则
def custom_deduplicate(data, key_func):
"""
key_func: 自定义的去重键函数
"""
seen = set()
result = []
for item in data:
key = key_func(item)
if key not in seen:
seen.add(key)
result.append(item)
return result
# 示例:根据字符串长度去重
words = ["apple", "banana", "cat", "dog", "elephant", "fox", "grape"]
unique_by_length = custom_deduplicate(words, lambda x: len(x))
print(f"根据长度去重: {unique_by_length}")
# 输出: ['apple', 'banana', 'elephant'] (每种长度只保留第一个)
# 示例:根据首字母去重
unique_by_first_letter = custom_deduplicate(words, lambda x: x[0])
print(f"根据首字母去重: {unique_by_first_letter}")
# 输出: ['apple', 'banana', 'cat', 'dog', 'elephant', 'fox', 'grape']
性能对比
import time
# 大数据量去重性能测试
large_data = list(range(1000000)) + list(range(500000, 1500000))
# 方法1: set去重
start = time.time()
result1 = list(set(large_data))
set_time = time.time() - start
print(f"Set去重耗时: {set_time:.4f}秒")
# 方法2: 循环去重
start = time.time()
seen = set()
result2 = []
for item in large_data:
if item not in seen:
seen.add(item)
result2.append(item)
loop_time = time.time() - start
print(f"循环去重耗时: {loop_time:.4f}秒")
print(f"结果是否一致: {sorted(result1) == sorted(result2)}")
总结建议
- 简单列表去重:使用
list(set(data))最快捷 - 需要保持顺序:使用循环 + set 的方法
- 结构化数据:使用 pandas 的
drop_duplicates() - 自定义对象:实现
__eq__和__hash__方法 - 大数据量:set 方法性能最好,但要注意内存占用
选择哪种方法主要取决于你的数据类型、是否需要保持顺序、以及数据量大小。