我正在 cutters
中的字母中切割 letterlist
。
cutspots
中的数字是指同一position
中 cutters
中的字母在该字母的右侧切下来,即0将切入左侧。
遵循这些规则,我获得了与wordlist
中的单词相关的结果,称这会生成1 'WORD'
和0 'ANOTHERK'
s。尽管两者都在那里,但它们不是通过切割产生的。
这最初是很快的,但是我发现自己,而不仅仅是在 wordlist
自己中搜索单词,需要确认我正在删除列表的字母实际上是在我的 letterlist
中和之后的。p>这会通过cutters
进行迭代来生成cutters[position]
,从而减慢了很大的速度,是否有其他聪明的方法来弄清楚我在wordlist
中的单词是否在适当位置的cutterlist
中的字母两侧?
import re
import itertools
letterlist = ['GIURELABGIRUGHAWUWORDHGUOIHRUANOTHERKHVUHREIAVHRELGBEIUVIREUVBKWORDGOREGK']
cutters = ['K', 'D']
cutspots = [1, 1]
wordlist = [['WORD'], ['ANOTHERK']]
wordfinder = [[sum(x) for x in zip(*[[len(list(set(itertools.chain(*[[m.start() for m in re.finditer(wordlist[i][j], letterlist[h]) if cutspots[position] == 0 and letterlist[h].endswith(wordlist[i][j]) or letterlist[h][m.start()+len(wordlist[i][j])-abs(0-cutspots[position])] is cutters[position]] for position in range(len(cutters))])) & set(itertools.chain(*[[m.start() for m in re.finditer(wordlist[i][j], letterlist[h]) if cutspots[position] == 1 and letterlist[h].startswith(wordlist[i][j]) or letterlist[h][m.start()-cutspots[position]] is cutters[position]] for position in range(len(cutters))])))) for j in range(len(wordlist[i]))] for h in range(len(letterlist))])] for i in range(len(wordlist))]
我愿意敢打赌,您的程序对于大字符串不佳的原因是因为它具有大于θ(n)的复杂性。此功能将切割一个字符串,您希望在那段时间将其切割:
def cut_string(string, cutters, cutspots):
split_list = ['']
cut_next = False
for char in string:
if cut_next:
split_list.append(char)
cut_next = (char in cutters) and (cutspots[cutters.index(char)])
else:
if char in cutters:
if cutspots[cutters.index(char)]:
cut_next = True
split_list[-1] += char
else:
split_list.append(char)
else:
split_list[-1] += char
return [string for string in split_list if string]
那么,我们可以简单地检查wordlist
中的任何单词是否是字符串的拆分部分(我认为您的意思是wordlist
为[['WORD', 'ANOTHERK']]
:
def list_cut(letterlist, wordlist, cutters, cutspots):
out_list = []
for sub_list, string in zip(wordlist, letterlist):
cut_list = cut_string(string, cutters, cutspots)
out_list.append([word in cut_list for word in sub_list])
return out_list
wordfinder = list_cut(letterlist, wordlist, cutters, cutspots)
print(wordfinder) #[[True, False]]