【发布时间】:2016-10-02 10:05:50
【问题描述】:
今天我意识到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个字符,并且首尾字符要完全匹配。为简洁起见,这里省略了这些行,因为它们实现起来很简单。
【问题讨论】:
-
只是在我的机器上用更长的随机模式运行基本测试,第二种方法,使用
index()和start参数,大约快5个数量级。当需要速度时,信任内置的底层 C 实现通常是安全的,而不是重新发明轮子。 -
查尔斯所说的。第一种方式主要是较慢,因为它必须在每个循环上构造一个新的
pattern[i:]字符串对象。