本文目录导读:

在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 方法性能最好,但要注意内存占用
选择哪种方法主要取决于你的数据类型、是否需要保持顺序、以及数据量大小。
版权声明:NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播