我正在跟踪帖子Search a list of list of strings for a list of strings in python efficiently,并try 在字符串列表中搜索子字符串列表.上面的帖子查找与字符串列表匹配的字符串列表的索引.在我的代码中,我子串L1并将其展平以匹配L2字符串.如何获取以L2字符串为子字符串的所有L1字符串的列表?现在,我正在获取匹配每个L2字符串的L1字符串列表的索引.
这就是我所走的路.我遵循的代码如下:
from bisect import bisect_left, bisect_right
from itertools import chain
L1=[["animal:cat","pet:dog","fruit:apple"],["fruit:orange","color:green","color:red","fruit:apple"]]
L2=["apple", "cat","red"]
M1 = [[i]*len(j) for i, j in enumerate(L1)]
M1 = list(chain(*M1))
L1flat = list(chain(*L1))
I = sorted(range(len(L1flat)), key=L1flat.__getitem__)
L1flat = sorted([L1flat[i].split(':')[1] for i in I])
print(L1flat)
M1 = [M1[i] for i in I]
for item in L2:
s = bisect_left(L1flat, item)
e = bisect_right(L1flat, item)
print(item, M1[s:e])
#print(L1flat[s:e])
sub = M1[s:e]
for y in sub:
print('%s found in %s' % (item, str(L1(y))))
编辑:我刚刚意识到我在搜索第二和第三项时遇到了错误.
三件事:
-
我通过枚举L1的拆分元素创建了M1
L1Splited=[I[0].Split(‘:’)[1]用于L1中的I]
M1=[[i]*len(J)for i,j in枚举(L1拆分)]
-
我反转了L1Flat中的元素并拆分了元素
L1flatReversed = []
对于枚举中的j,x(L1Flat)
L1flatReversed.append(reverseString(x, ':'))
-
然后我将另一串颠倒的字符串拆分
L1Flat ReversedSplit=[L1Flat Reversed[i].Split(‘:’)[0]for i in i]
现在我的S和e在L1平坦上一分为二