检查另一个列表中字符串列表中是否存在字符串字符?

时间:2018-05-02 10:27:23

标签: python string python-3.x

是否有更有效的方法来比较字符串列表而不是使用for循环?

我想检查y中是否存在x个字符串(在y字符串的任何部分)。

x = ['a1' , 'a2', 'bk']
y = ['a1aa' , 'a2lop' , 'bnkl', 'a1sss', 'flask']
for i in x:
    print([i in str_y for str_y in y])

结果:

[True, False, False, True, False]
[False, True, False, False, False]
[False, False, False, False, False]

5 个答案:

答案 0 :(得分:2)

使用列表压缩:

In [4]: [[b in a for a in y] for b in x]
Out[4]:
[[True, False, False, True, False],
 [False, True, False, False, False],
 [False, False, False, False, False]]

测试时间:

 %timeit print([[b in a for a in y] for b in x])
<lots of printing>
228 µs ± 5.5 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
 %timeit for i in x:   print([i in x for x in y])
<lots of printing>
492 µs ± 4.92 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)

一半的时间。

答案 1 :(得分:1)

您可以使用itertools.product将所有结果放在一个列表中:

In [61]: x = ['a1' , 'a2', 'bk']
    ...: y = ['a1aa' , 'a2lop' , 'bnkl', 'a1sss', 'flask']
    ...: 

In [62]: [i in j for i, j in product(x, y)]

或者作为一种功能方法,您可以同时使用starmapproduct

from itertools import product, starmap
from operator import contains

list((starmap(contains, product(y, x))))

此外,未经过优化的矢量化BUT如下:

In [139]: (np.core.defchararray.find(y[:,None], x) != -1).T
Out[139]: 
array([[ True, False, False,  True, False],
       [False,  True, False, False, False],
       [False, False, False, False, False]])

答案 2 :(得分:1)

您只能使用list comprehension

x = ['a1' , 'a2', 'bk']
y = ['a1aa' , 'a2lop' , 'bnkl', 'a1sss', 'flask']
print([[xi in z for z in y] for xi in x])

答案 3 :(得分:0)

不,我不这么认为,不是一种不需要大量预先计算的简单方法。

如果你只需知道其中一个haystack是否在any()中,请使用for - 或者一个好的break循环和{{ 1}}甚至更快:

needles = ['a1' , 'a2', 'bk']
haystacks = ['a1aa' , 'a2lop' , 'bnkl', 'a1sss', 'flask']

for haystack in haystacks:
    for needle in needles:
      if needle in haystack:
        print((needle, haystack))
        break  # Break if finding one match is enough

答案 4 :(得分:0)

我认为唯一的解决方案是使用for循环... 如果你想把代码放在一行,最好的办法就是这样做:

print( [[xx in i for i in y] for xx in x] )