Python - 检查字符串是否包含列表中任何项目中的特定字符的最快方法

Muh*_*aha 9 python iteration performance list

检查字符串是否包含列表中任何项目的某些字符的最快方法是什么?

目前,我正在使用这种方法:

lestring = "Text123"

lelist = ["Text", "foo", "bar"]

for x in lelist:
    if lestring.count(x):
        print 'Yep. "%s" contains characters from "%s" item.' % (lestring, x)
Run Code Online (Sandbox Code Playgroud)

有没有办法在没有迭代的情况下做到这一点(我认为这会让它更快.)?

Abh*_*jit 17

您可以尝试使用成员资格检查列表理解

>>> lestring = "Text123"
>>> lelist = ["Text", "foo", "bar"]
>>> [e for e in lelist if e in lestring]
['Text']
Run Code Online (Sandbox Code Playgroud)

与你的实现相比,虽然LC有一个隐式循环,但它更快,因为没有像你的情况那样的显式函数调用 count

与Joe的实现相比,你的实现更快,因为过滤器函数需要在循环中调用两个函数,lambda并且count

>>> def joe(lelist, lestring):
    return ''.join(random.sample(x + 'b'*len(x), len(x)))

>>> def uz(lelist, lestring):
    for x in lelist:
        if lestring.count(x):
            return 'Yep. "%s" contains characters from "%s" item.' % (lestring, x)


>>> def ab(lelist, lestring):
    return [e for e in lelist if e in lestring]

>>> t_ab = timeit.Timer("ab(lelist, lestring)", setup="from __main__ import lelist, lestring, ab")
>>> t_uz = timeit.Timer("uz(lelist, lestring)", setup="from __main__ import lelist, lestring, uz")
>>> t_joe = timeit.Timer("joe(lelist, lestring)", setup="from __main__ import lelist, lestring, joe")
>>> t_ab.timeit(100000)
0.09391469893125759
>>> t_uz.timeit(100000)
0.1528471407273173
>>> t_joe.timeit(100000)
1.4272649857800843
Run Code Online (Sandbox Code Playgroud)

对于较短的字符串,Jamie的评论解决方案较慢.这是测试结果

>>> def jamie(lelist, lestring):
    return next(itertools.chain((e for e in lelist if e in lestring), (None,))) is not None

>>> t_jamie = timeit.Timer("jamie(lelist, lestring)", setup="from __main__ import lelist, lestring, jamie")
>>> t_jamie.timeit(100000)
0.22237164127909637
Run Code Online (Sandbox Code Playgroud)

如果需要布尔值,对于较短的字符串,只需修改上面的LC表达式即可

[e in lestring for e in lelist if e in lestring]
Run Code Online (Sandbox Code Playgroud)

或者对于更长的字符串,您可以执行以下操作

>>> next(e in lestring for e in lelist if e in lestring)
True
Run Code Online (Sandbox Code Playgroud)

要么

>>> any(e in lestring for e in lelist)
Run Code Online (Sandbox Code Playgroud)