首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Python:优化筛选字符方法运行时所需的建议

Python:优化筛选字符方法运行时所需的建议
EN

Stack Overflow用户
提问于 2014-11-07 18:30:58
回答 3查看 174关注 0票数 2

我现在有一个需要优化的方法!我还在学习蟒蛇,所以我会非常感谢你的帮助!

我试图在一个非常大的语料库上运行下面的方法,并且我需要优化/减少这个方法的运行时间,因为它已经占用了大约6秒的时间来执行。

需求:

  1. 检查单词仅由字母、连字符和撇号组成。
  2. 单词的第一个字符必须是字母表
  3. 单词的最后一个字符必须是字母表或撇号。
  4. 严格不允许使用re库(regex)

下面是代码:

代码语言:javascript
复制
def delUnknownChar(w):
    wf = []
    for c in w:
        if (c == "'" or c == "-" or c.isalpha()):
            wf.append(c)

    w = "".join(wf)
    wf.clear()

    if (len(w) > 1):
        while(not w[0].isalpha()):
            w = w[1:]

        while (w[-1] == "-"):
            w = w[:-1]

        return w
    else:
        return None

string1 = delUnknownChar("-'test'-")
print(string1)

输出将是测试‘,上面的代码将花费大约5秒的时间运行。

如果我将代码的第2-7行改为这一行:

代码语言:javascript
复制
w = "".join(c for c in w if c == "'" or c == "-" or c.isalpha())

运行时以某种方式增加了1秒。

有没有人有一个更好的想法或改进的优化方法来检查这一速度快得多?谢谢!

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2014-11-07 18:36:40

试试str.translate

代码语言:javascript
复制
from string import punctuation,digits

def delUnknownChar(s):
    trans = """!"#$%&()*+,./:;<=>?@[\]^_`{|}~0123456789"""
    return s.translate(None,trans).lstrip("-'").rstrip("-")

Python 3:

代码语言:javascript
复制
trans = """!"#$%&()*+,./:;<=>?@[\]^_`{|}~0123456789"""
d = {k: "" for k in trans}
def delUnknownChar1(s):
    return s.translate(str.maketrans(d)).lstrip("-'").rstrip("-")

不翻译:

代码语言:javascript
复制
def delUnknownChar1(s):
    good = set("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ-'")
    clean = ""
    for ele in s:
        if ele in good:
            clean += ele
    return clean.lstrip("-'").rstrip("-")

静态str.maketrans(x[,y,z])

此静态方法返回一个可用于str.translate()的转换表。如果只有一个参数,则必须是将Unicode序数(整数)或字符(长度为1的字符串)映射到Unicode序数、字符串(任意长度)或无字符串的字典。字符键将被转换为序号。如果有两个参数,它们必须是长度相等的字符串,在产生的字典中,x中的每个字符将映射到y中相同位置的字符。如果有第三个参数,则必须是字符串,其字符将映射到结果中的任何字符。

代码语言:javascript
复制
In [30]: timeit Filter(s)
100 loops, best of 3: 10.48 ms per loop

In [31]: timeit delUnknownChar(s) # yours
100 loops, best of 3: 8.41 ms per loop

In [32]: timeit delUnknownChar1(s) # mine
100 loops, best of 3: 2.46 ms per loop
In [25]: timeit delUnknownChar1(s)
100 loops, best of 3: 3.72 ms per loop
票数 -1
EN

Stack Overflow用户

发布于 2014-11-07 20:34:33

使用其中之一

代码语言:javascript
复制
def Filter(In):
    # First alpha character
    for b in range(len(In)):
        if In[b].isalpha():
            break
    if b == len(In):
        return ""

    # Last alpha' character
    for e in range(len(In), 0, -1):
        if In[e - 1].isalpha() or In[e - 1] == "'":
            break

    # Middle alpha-' characters
    Out= [In[b]]  
    for i in range(b + 1, e):
      if In[i].isalpha() or In[i] == "-" or In[i] == "'":
        Out+= In[i]   

    return "".join(Out)

代码语言:javascript
复制
def Filter(In):
    # First alpha character
    for b in range(len(In)):
        if In[b].isalpha():
            break
    if b == len(In):
        return ""

    # Last alpha' character
    for e in range(len(In), 0, -1):
        if In[e - 1].isalpha() or In[e - 1] == "'":
            break

    # Middle alpha-' characters
    Out= In[b]
    for i in range(b + 1, e):
      if In[i].isalpha() or In[i] == "-" or In[i] == "'":
        Out+= In[i] 

    return Out

根据您的字符串分发和Python版本/平台的不同,使用最快的。

更新:这是一个基于对规范的更好理解的新版本。

票数 1
EN

Stack Overflow用户

发布于 2014-11-07 18:47:55

使用一些标准库:

代码语言:javascript
复制
import string

filter_set = set(string.ascii_letters + "-'")

def delUnknownChar(w):
    return ''.join(c for c in w if c in filter_set).lstrip("'-").rstrip("-")

使用translate的替代方法

代码语言:javascript
复制
import string

keep = string.ascii_letters + "-'"
allchars = string.maketrans('', '')
delchars = ''.join([c for c in allchars if c not in keep])

def delUnknownChar(w):
    return w.translate(None, delchars).lstrip("'-").rstrip("-")

(基于这个解决方案)

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26807762

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档