找到一个单词并确认一个单词的周围字母有效地有效地



我正在 cutters中的字母中切割 letterlist

cutspots中的数字是指同一positioncutters中的字母在该字母的右侧切下来,即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]]

最新更新