python两种列表元素去重函数性能比较

本文通过对比两种Python列表去重方法的效率,发现对于较短列表(长度<=1000),使用字典.fromkeys()的方法更快;而对于较长列表,则推荐使用set()函数。此外,还提供了一些关于大规模数据处理的建议。
测试函数:
第一种:list的set函数
第二种:{}.fromkeys().keys()
测试代码:
#!/usr/bin/python
#-*- coding:utf-8 -*-
import time
import random

l1 = []
leng = 10L
for i in range(0,leng):
    temp = random.randint(1,10)
    l1.append(temp)
print '测试列表长度为:',leng
#first set
last = time.clock()
l2 = list(set(l1))
print l2
now = time.clock()
print '第一种:',now-last

#second
last = time.clock()
l2 =  {}.fromkeys(l1).keys()
print l2
now = time.clock()
print '第二种:',now-last
测试结果:





我们可以看出,当测试列表长度很短时,使用第二种方法较快,在1000时,第一种性能已经超过第二种了,列表越长,第一种方法优势越明显。当频繁的对短列表进行去重时(长度<=1000)建议使用第二种方法,当长度超过1000时建议使用第二种方法。
但归根结底,建议不要用python进行大规模的数据计算,建议使用matlab、或者python的matlab库,毕竟专业的还是厉害。
<think>我们被要求:在Python中对列表元素进行,同时保持元素原有的顺序。 根据引用[1]、[2]、[3]提供的方法,我们可以使用集合(set)来记录已经出现过的元素,然后通过列表推导式构建新列表,确保只保留第一次出现的元素。 具体方法如下: 1. 创建一个空集合seen,用于存储已经出现过的元素2. 遍历原始列表的每个元素,如果元素不在seen中,则将其加入新列表,并添加到seen集合中;否则跳过。 3. 这样就能保证新列表中的元素顺序与原始列表中的顺序一致(保留第一次出现的顺序)。 引用[1]中提供了一个函数: def remove_duplicates(lst): seen = set() return [x for x in lst if not (x in seen or seen.add(x))] 这个函数利用了列表推导式和集合的高效查找。注意:`seen.add(x)`会返回None,因此`not (x in seen or seen.add(x))`的含义是: - 如果x不在seen中,那么条件判断会执行`seen.add(x)`(因为or的短路特性,当第一个条件为False时会执行第二个条件),然后`seen.add(x)`返回None(相当于False),所以整个条件为False,然后取反为True,因此这个元素会被保留。 - 如果x在seen中,那么`x in seen`为True,由于or的短路,后面的`seen.add(x)`不会执行,整个条件为True,取反为False,因此这个元素被跳过。 但是,这个写法可能不太直观,我们可以换一种更易读的方式: 另一种写法(使用循环): def remove_duplicates(lst): seen = set() result = [] for item in lst: if item not in seen: seen.add(item) result.append(item) return result 两种方法都可以,第一种更简洁,第二种更易读。 另外,引用[3]提到,使用set()会改变顺序,所以不能直接使用set()。 因此,我们推荐使用上述方法。 下面我们给出示例代码:</think>### Python保留顺序列表元素Python中,要保留元素顺序并列表中的元素,可以使用以下高效方法: #### 方法1:使用集合记录已出现元素(推荐) ```python def remove_duplicates(lst): seen = set() return [x for x in lst if not (x in seen or seen.add(x))] # 示例 original_list = [3, 2, 1, 2, 4, 3, 5] result = remove_duplicates(original_list) print(result) # 输出: [3, 2, 1, 4, 5] ``` **原理说明**: 1. 创建空集合`seen`跟踪已出现元素 2. 列表推导式遍历原始列表: - 若元素不在`seen`中:添加元素到结果列表和`seen`集合 - 若元素已在`seen`中:跳过该元素 3. 利用`or`的短路特性:`seen.add(x)`返回`None`(假值),确保条件逻辑正确[^1][^3] #### 方法2:使用字典保留顺序(Python 3.7+) ```python def remove_duplicates_dict(lst): return list(dict.fromkeys(lst)) # 示例 print(remove_duplicates_dict([1, 5, 2, 5, 3, 1])) # 输出: [1, 5, 2, 3] ``` **特点**: - 利用Python 3.7+字典的插入顺序特性 - 代码更简洁,但性能略低于方法1[^2] #### 方法3:使用有序字典(兼容旧版Python) ```python from collections import OrderedDict def remove_duplicates_ordered(lst): return list(OrderedDict.fromkeys(lst)) # 示例 print(remove_duplicates_ordered(['a', 'b', 'a', 'c'])) # 输出: ['a', 'b', 'c'] ``` #### 性能对比 | 方法 | 时间复杂度 | 空间复杂度 | 适用场景 | |------|------------|------------|----------| | 集合跟踪 | O(n) | O(n) | 通用场景(最佳性能) | | 字典 | O(n) | O(n) | Python 3.7+ | | 有序字典 | O(n) | O(n) | Python <3.7 | **关键点**: 1. 直接使用`set()`会破坏顺序:`list(set(original_list))` 2. 所有方法都保持元素首次出现的顺序 3. 方法1在大型数据集上性能最优(尤其适合百万级数据)[^2] #### 实际应用示例 ```python # 处理用户访问记录(保留首次访问时间) user_logs = [ {'user': 'Alice', 'time': '09:00'}, {'user': 'Bob', 'time': '09:15'}, {'user': 'Alice', 'time': '10:30'}, {'user': 'Charlie', 'time': '11:00'} ] # 按用户(保留第一条记录) seen_users = set() unique_logs = [log for log in user_logs if not (log['user'] in seen_users or seen_users.add(log['user']))] print(unique_logs) # 输出: [{'user': 'Alice', 'time': '09:00'}, # {'user': 'Bob', 'time': '09:15'}, # {'user': 'Charlie', 'time': '11:00'}] ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值