是否有更有效的方法来比较字符串列表而不是使用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]
答案 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)]
或者作为一种功能方法,您可以同时使用starmap
和product
:
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] )