栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

使用Python从字符串中删除数字以外的字符?

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

使用Python从字符串中删除数字以外的字符?

在Python 2. *中,到目前为止最快的方法是

.translate

>>> x='aaa12333bb445bb54b5b52'>>> import string>>> all=string.maketrans('','')>>> nodigs=all.translate(all, string.digits)>>> x.translate(all, nodigs)'1233344554552'>>>

string.maketrans
生成一个转换表(长度为256的字符串),在这种情况下,该转换表与
''.join(chr(x) for x inrange(256))
(更快地制作;-)相同。
.translate
应用转换表(这里无关紧要,因为
all
本质上是指身份),并删除第二个参数(关键部分)中存在的字符。

.translate
在Unipre字符串(和Python 3中的字符串)上的工作方式大不相同-我 确实
希望指出问题是关注哪个Python的主要发行版!)-并不是那么简单,不是那么快,尽管仍然非常有用。

回到2. *,性能差异令人印象深刻……:

$ python -mtimeit -s'import string; all=string.maketrans("", ""); nodig=all.translate(all, string.digits); x="aaa12333bb445bb54b5b52"' 'x.translate(all, nodig)'1000000 loops, best of 3: 1.04 usec per loop$ python -mtimeit -s'import re;  x="aaa12333bb445bb54b5b52"' 're.sub(r"D", "", x)'100000 loops, best of 3: 7.9 usec per loop

将事情加速7到8倍几乎不是花生,因此该

translate
方法非常值得了解和使用。另一种流行的非RE方法…:

$ python -mtimeit -s'x="aaa12333bb445bb54b5b52"' '"".join(i for i in x if i.isdigit())'100000 loops, best of 3: 11.5 usec per loop

比RE慢50%,因此该

.translate
方法将其击败了一个数量级。

在Python
3或Unipre中,您需要传递

.translate
一个映射(以普通字符而不是直接字符作为键),该映射返回
None
要删除的内容。这是删除“除以下所有内容外的所有字符”的便捷方式:

import stringclass Del:  def __init__(self, keep=string.digits):    self.comp = dict((ord(c),c) for c in keep)  def __getitem__(self, k):    return self.comp.get(k)DD = Del()x='aaa12333bb445bb54b5b52'x.translate(DD)

也发出

'1233344554552'
。但是,将其放入xx.py中,我们可以…:

$ python3.1 -mtimeit -s'import re;  x="aaa12333bb445bb54b5b52"' 're.sub(r"D", "", x)'100000 loops, best of 3: 8.43 usec per loop$ python3.1 -mtimeit -s'import xx; x="aaa12333bb445bb54b5b52"' 'x.translate(xx.DD)'10000 loops, best of 3: 24.3 usec per loop

…表明性能优势对于这种“删除”任务消失了,而变成了性能下降。



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/391352.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号