Python案例如何实现列表去重?

wen python案例 9

本文目录导读:

Python案例如何实现列表去重?

  1. 使用set(最简单,但会打乱顺序)
  2. 保持原顺序的去重方法
  3. 处理复杂数据类型
  4. 针对特定场景的方法
  5. 使用第三方库(pandas)
  6. 性能对比
  7. 推荐使用场景

在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

选择哪种方法取决于你的具体需求:是否需要保持顺序、数据类型是否简单、性能要求如何等因素。

抱歉,评论功能暂时关闭!