您可以使用列表推导来做到这一点。
def filter_possible_chars(corpus, last):
parts = [word.split(last) for word in corpus.split() if last in word]
return [w[1][0] for w in parts if w[1]]
print (filter_possible_chars('lazy languid line', 'la'))
print (filter_possible_chars('pitter patter batton', 'tt'))
print (filter_possible_chars('pitter pattor batt', 'tt'))
print (filter_possible_chars('pitter pattor batt', 'it'))
print (filter_possible_chars('pitter pattor batt', 'er'))
print (filter_possible_chars('pitter pattor batt', 'ox'))
您可以将这两行组合成一个长列表理解,如下所示:
return [word.split(last)[1][0] for word in corpus.split() if last in word and word.split(last)[1]]
让我解释一下代码:
parts = [word.split(last) for word in corpus.split() if last in word]
在这里,我尝试使用
将语料库拆分为单个单词
for word in corpus.split()
之后,我正在检查last 是否在单个单词中
如果子字符串last 存在,那么我将使用last 作为子字符串再次拆分单词。这将给出两组字符串。第一部分将是last 中子字符串之前的所有字符,第二部分将是last 中子字符串之后的所有字符。
例如,lazy 将被拆分为 ['', 'zy'] 的子字符串 la。而pitter 将被拆分为['pi', 'er'] 为tt
获得此列表后,您需要从索引 1 中选择第一个字符。
搜索la:
lazy languid line 将导致[['', 'zy'], ['', 'nguid']]
用于搜索“tt”:
pitter patter batton 将导致[['pi', 'er'], ['pa', 'er'], ['ba', 'on']]
用于搜索“tt”:
pitter pattor batt 将导致[['pi', 'er'], ['pa', 'or'], ['ba', '']]
用于搜索“er”:
pitter pattor batt 将导致[]
搜索“牛”:
pitter pattor batt 将导致[]
这告诉我们,只要索引 1 的值有一个字符串,我们就可以选择所有结果。
所以下一个列表理解语句是:
return [w[1][0] for w in parts if w[1]]
在这里,我们从parts 中提取每个块,并检查索引 1 是否包含任何字符串。如果是,则提取第0个位置并返回。
以下语句的输出是:
print (filter_possible_chars('lazy languid line', 'la'))
print (filter_possible_chars('pitter patter batton', 'tt'))
print (filter_possible_chars('pitter pattor batt', 'tt'))
print (filter_possible_chars('pitter pattor batt', 'it'))
print (filter_possible_chars('pitter pattor batt', 'er'))
print (filter_possible_chars('pitter pattor batt', 'ox'))
['z', 'n']
['e', 'e', 'o']
['e', 'o']
['t']
[]
[]