这个需求涉及到集合,上代码前先讲讲集合讲集合前我们先回顾一下可变数据类型和不可变数据类型,今天小编就来聊一聊关于python列表剔除重复元素?接下来我们就一起去研究一下吧!
python列表剔除重复元素
这个需求涉及到集合,上代码前先讲讲集合。讲集合前我们先回顾一下可变数据类型和不可变数据类型。
- 不可变数据类型:数字number(含int、float、bool、complex)、字符串string、元组tuple。
- 可变数据类型:列表list、字典dict、集合set。
集合的存取是基于hash算法映射,只有不可变数据类型才能做hash算法,所以集合中只能存放不可变数据类型。集合的特性是去重、无序。学集合时最先接触的是交并差,每一本教python的书讲到集合都不会漏讲交并差,这里就不赘述了。
那么现在,我们需要将一个列表中的元素去重并保持原有顺序。最优解是什么?
还是直接上代码看案例吧:
raw_address = ['北京市', '北京市', '昌平区', '人民大街', '9999号'] # 原始地址信息
# 如何原始地址中重复的元素信息与数据库中进行匹配?
address = list(set(raw_address)) # 对原始地址list先转成集合再转成列表,自动完成去重
print(address) # 输出的是['人民大街', '昌平区', '9999号', '北京市']
address.sort(key=raw_address.index) # 再对去重后的列表按原始顺序排列
print(address) # 输出的是['北京市', '昌平区', '人民大街', '9999号']
可以看到用python对列表中的元素去重并保持原始的顺序只要2行代码即可完成,运行速度也相当高。
这背后是什么原理呢?
这是因为在python中变量实质是一种引用,上述案例中raw_address列表有5条字符串,分别存储在内存不同的地址。rad_address列表中保存了5条字符串的内存地址,在去重的时候不需要对列表中的字符串两两匹配是否有重复(这种运算相当耗时),只要检测是否存在相同的内存地址引用,去掉重复的引用只保留一条即可迅速去重。在还原顺序的时候只要根据原列表的元素索引排序即可。
,