python 高效的list 去重方式
🕕 by pyList at 2015-03-27 17:24
list 去重是编程中经常用到的,python 的去重方式很灵活,下面介绍多种去重方式,并比较得出最高效的方式。
直接贴出最后结果
list(set(seq))
# or
{}.fromkeys(seq).keys()
完整的比较测试
from random import shuffle, randint
import re
from sets import Set
def f1(seq): # Raymond Hettinger
# not order preserving
set = {}
map(set.__setitem__, seq, [])
return set.keys()
def f2(seq): # *********
# order preserving
checked = []
for e in seq:
if e not in checked:
checked.append(e)
return checked
def f3(seq):
# Not order preserving
keys = {}
for e in seq:
keys[e] = 1
return keys.keys()
def f4(seq): # ********** order preserving
noDupes = []
[noDupes.append(i) for i in seq if not noDupes.count(i)]
return noDupes
def f5(seq, idfun=None): # Alex Martelli ******* order preserving
if idfun is None:
def idfun(x): return x
seen = {}
result = []
for item in seq:
marker = idfun(item)
# in old Python versions:
# if seen.has_key(marker)
# but in new ones:
if marker in seen: continue
seen[marker] = 1
result.append(item)
return result
def f5b(seq, idfun=None): # Alex Martelli ******* order preserving
if idfun is None:
def idfun(x): return x
seen = {}
result = []
for item in seq:
marker = idfun(item)
# in old Python versions:
# if seen.has_key(marker)
# but in new ones:
if marker not in seen:
seen[marker] = 1
result.append(item)
return result
def f6(seq):
# Not order preserving
return list(Set(seq))
def f7(seq):
# Not order preserving
return list(set(seq))
def f8(seq): # Dave Kirby
# Order preserving
seen = set()
return [x for x in seq if x not in seen and not seen.add(x)]
def f9(seq):
# Not order preserving
return {}.fromkeys(seq).keys()
def f10(seq, idfun=None): # Andrew Dalke
# Order preserving
return list(_f10(seq, idfun))
def _f10(seq, idfun=None):
seen = set()
if idfun is None:
for x in seq:
if x in seen:
continue
seen.add(x)
yield x
else:
for x in seq:
x = idfun(x)
if x in seen:
continue
seen.add(x)
yield x
def f11(seq): # f10 but simpler
# Order preserving
return list(_f10(seq))
def _f11(seq):
seen = set()
for x in seq:
if x in seen:
continue
seen.add(x)
yield x
import time
def timing(f, n, a):
print f.__name__,
r = range(n)
t1 = time.clock()
for i in r:
f(a); f(a); f(a); f(a); f(a); f(a); f(a); f(a); f(a); f(a)
t2 = time.clock()
print round(t2-t1, 3)
def getRandomString(length=10, loweronly=1, numbersonly=0,
lettersonly=0):
""" return a very random string """
_letters = 'abcdefghijklmnopqrstuvwxyz'
if numbersonly:
l = list('0123456789')
elif lettersonly:
l = list(_letters + _letters.upper())
else:
lowercase = _letters+'0123456789'*2
l = list(lowercase + lowercase.upper())
shuffle(l)
s = ''.join(l)
if len(s) < length:
s = s + getRandomString(loweronly=1)
s = s[:length]
if loweronly:
return s.lower()
else:
return s
testdata = {}
for i in range(35):
k = getRandomString(5, lettersonly=1)
v = getRandomString(100 )
testdata[k] = v
testdata = [int(x) for x in list('21354612')]
testdata += list('abcceeaa5efm')
class X:
def __init__(self, n):
self.foo = n
def __repr__(self):
return "<foo %r>"%self.foo
def __cmp__(self, e):
return cmp(self.foo, e.foo)
testdata = []
for i in range(10000):
testdata.append(getRandomString(3, loweronly=True))
#testdata = ['f','g','c','d','b','a','a']
order_preserving = f2, f4, f5, f5b, f8, f10, f11
order_preserving = f5, f5b, f8, f10, f11
not_order_preserving = f1, f3, f6, f7, f9
testfuncs = order_preserving + not_order_preserving
for f in testfuncs:
if f in order_preserving:
print "*",
timing(f, 100, testdata)
在我机器上运行结果
* f5 3.51
* f5b 3.49
* f8 2.02
* f10 2.57
* f11 2.54
f1 1.54
f3 1.25
f6 1.36
f7 0.89
f9 0.89
总结
下面两种最高效
def f7(seq):
# Not order preserving
return list(set(seq))
def f9(seq):
# Not order preserving
return {}.fromkeys(seq).keys()
\r\n
去除文件with open("file.txt") as rf, open("out.txt", "w") as wf:
for line in rf:
wf.write("%s\r\n" % line.strip())
本文网址: https://pylist.com/t/1427448258 (转载注明出处)
如果你有任何建议或疑问可以在下面 留言
发表第一条评论!
相关推荐
小工具
标签
python
list
按键
排序
高效
字符串
随机
生成
颜色
csv
读写
文件
标准
dbutils
连接池
mysql
数据
md5
正确
计算
xor
解密
加密
方法
ssdb
缓存
分享
一个
pil
验证码
图片
sae
image
高质量
转码
链接
中文
安全
socks5
代理
依赖
安装
使用
bbr
openwrt
路由
开启
utf
gbk
big5
golang
转换
google
身份验证
authenticator
迁移
手机
linux
ulimit
永久
设置
系统
app
mac
store
登录
未知
国外
vps
nginx
反向
访问
国内
上传
服务器
中断
usb
上网卡
共享
网络
form
data
post
硬件加速
ubnt
er
固件
go2o
开源
完整
商业
spotify
chartify
图表
乱码
vim
解决
正则
切割
自动更新
microsoft
关闭
静音
风扇
主机
笔记本
改造
低功耗
web
爬虫
组装
微信
尝鲜
视频
体验
cpu
debian
ubuntu
查看
温度
chrome
server
浏览
webdriver
微博
selenium
gnu
系统启动
编译
宅家
坑记
屏幕
动手
quic
抢先
useragent
搜索引擎
蜘蛛
真假
识别
最近发表
- Mac 关闭 Microsoft 自动更新
- Mac 登录 App Store 出现“发生了未知错误”的解决方法
- 老笔记本改造为无风扇静音主机方案
- 自己组装21瓦低功耗家庭爬虫、文件、web服务器
- 微信视频号尝鲜体验
- Ubuntu/Debian 查看CPU温度的方法
- 在Ubuntu/debian Server 系统使用Chrome 无头浏览模式
- 换手机后 Google 身份验证器 Google Authenticator 数据迁移的简单方法
- 使用Golang selenium WebDriver 自动登录微博
- 在 Ubuntu 或其它 GNU/Linux 系统下安装 Debian
- Mac 下制作 USB ubuntu/debian 系统启动、安装盘的几种方法
- ubuntu/debian 下自行编译 OpenWRT 固件
- 宅家自己动手换手机屏幕掉坑记
- 路由 UBNT ER-X 官方固件升级及开启硬件加速的方法
- 在 Nginx 和 Golang web 上抢先体验 QUIC
- 从UserAgent识别搜索引擎并判断真假蜘蛛
最近浏览
- go get 使用socks5 代理安装依赖库
- Openwrt 路由上开启BBR
- Golang 实现 GBK、Big5、UTF-8 之间的转换
- 换手机后 Google 身份验证器 Google Authenticator 数据迁移的简单方法
- Linux 系统永久设置ulimit
- Mac 登录 App Store 出现“发生了未知错误”的解决方法
- 在国外vps 上配置nginx 作反向代理访问国外网站
- OpenWrt 国内源
- Nginx 服务器上传大文件经常中断的解决方法
- Openwrt 使用USB 4G 上网卡共享网络
- python form-data post上传数据简便方法
- 路由 UBNT ER-X 官方固件升级及开启硬件加速的方法
- go2o: 一个完整的golang 商业开源项目
- Spotify开源的Python图表生成库chartify
- linux vim 中文显示乱码的解决方法
- Golang 正则切割字符串