今天我意识到python的list.index
也可以选择start
(甚至是end
)参数。
我想知道这是否有效实施以及这两者中的哪一个更好:
pattern = "qwertyuytresdftyuioknn"
words_list = ['queen', 'quoin']
for word in words_list:
i = 1
for character in word:
try:
i += pattern[i:].index(character)
except ValueError:
break
else:
yield word
或
pattern = "qwertyuytresdftyuioknn"
words_list = ['queen', 'quoin']
for word in words_list:
i = 1
for character in word:
try:
i = pattern.index(character, i)
except ValueError:
break
else:
yield word
基本上i += pattern[i:].index(character)
vs i = pattern.index(character, i)
。
在 generic_search_machine 上搜索此内容没有任何帮助,除了很多初学者教程试图教我列表是什么。
背景
此代码尝试查找words_list
中匹配pattern
的所有字词。 pattern
是用户通过在键盘上滑动输入的字符列表,就像在大多数现代移动设备的键盘上一样。
在实际实现中,还有一个要求,即返回的单词应该超过5个字符,并且第一个和最后一个字符必须完全匹配。为简洁起见,这里省略了这些行,因为它们实现起来很简单。
答案 0 :(得分:3)
这会调用在C:
中实现的内置函数i = pattern.index(character, i)
即使没有查看source code,您也可以始终假设底层实现足够智能,可以有效地实现它,即它不会查看列表中的第一个i
值。 / p>
根据经验,使用内置功能总是比您自己实现的最好的事情更快(或至少快)。
尝试做得更好:
i += pattern[i:].index(character)
这无疑更糟糕。它会生成 <{strong> pattern[i:]
的副本,然后在其中查找character
。
因此,在最坏的情况下,如果您的pattern
为1 GB且i=1
,则会在内存中复制1 GB的数据,以尝试跳过第一个元素(已被跳过)反正)。