python 高效的list 去重方式
🕕 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
按键
排序
高效
几种
部署
方案
不同
lru
golang
缓存
简单
spotify
chartify
开源
图表
csv
读写
文件
标准
json
unicode
中文
性能
示例
ffmpeg
一览表
参数
os
popen
超时
解决
print
终端
正确
命令行
处理
cms
django
推荐
系统
ubuntu
socks5
代理
依赖
安装
使用
简析
await
async
场景
adblock
攻守
dbutils
连接池
mysql
数据
转码
链接
安全
模版
引擎
构建
高速
js
全屏
浏览器
方法
实现
一键
脚本
制作
程序
启动
访问速度
vps
bbr
开启
加速
wkwebview
ios
载入
灵活
text
sublime
内存
暴涨
虚拟机
virtualbox
很慢
网络
qq
时隔多年
网页
登录
换行
字符串
替换
文本
正文
提取
新闻
互转
简体
繁体
opencc
预览
原生
图片
选择
变砖
arris
ac1750
sbr
路由
openwrt
修砖记
ubnt
er
tftp
webview
file
android
input
上传
fonts
css
html
最近发表
- 利用文本及符号密度来提取新闻网页正文
- 在 Ubuntu 16.04.6 LTS 系统上安装 Python 3.6.3
- go get 使用socks5 代理安装依赖库
- Golang结合OpenCC实现高效的中文简体繁体互转
- 原生 js 实现选择图片后本地预览
- async/await 使用场景简析
- 关于 AdBlock 的“攻守道”
- ARRIS SBR-AC1750 路由变砖拆解折腾
- Openwrt 路由上开启BBR
- UBNT ER-X 变砖 tftp 修砖记
- Android webview input file 上传图片
- js实现浏览器全屏方法
- 时隔多年,关于网页用QQ、微博登录
- 一键下载网站资源(html/css/js/fonts)
- 一键制作程序启动脚本
- 开启BBR 加速小VPS访问速度
最近浏览
- django cms系统推荐
- 在 Ubuntu 16.04.6 LTS 系统上安装 Python 3.6.3
- go get 使用socks5 代理安装依赖库
- async/await 使用场景简析
- 关于 AdBlock 的“攻守道”
- Python 用DBUtils 建立mysql 数据连接池
- 用python 对中文链接安全转码
- 如何用Python构建高速的模版引擎
- js实现浏览器全屏方法
- 一键制作程序启动脚本
- 开启BBR 加速小VPS访问速度
- IOS WKWebView 灵活载入本地文件和网络文件
- 解决Sublime text 内存暴涨的问题
- VirtualBox 虚拟机里网络很慢的解决方法
- 时隔多年,关于网页用QQ、微博登录
- Sublime 把字符串替换为换行