好吧,我正在制作一个基于命令行的网站搜索功能实现。该网站按字母顺序列出了我需要的所有链接。
用法类似于
./find.py LinkThatStartsWithB
因此它将导航到与字母B相关联的网页。 我的问题是,用户使用输入并导航到网页的最有效/最智能的方法是什么?
我最初的想法是使用列表,然后获取单词的第一个字母并使用数字标识符告诉列表索引的去向。
(A = 1,B = 2 ......) 示例代码:
#Use base url as starting point then add extension on end.
Base_URL = "http://www.website.com/"
#Use list index as representation of letter
Alphabetic_Urls = [
"/extensionA.html",
"/extensionB.html",
"/extensionC.html",
]
或者词典会更好吗?
由于
答案 0 :(得分:3)
您是如何获得此URL列表的?
如果您的命令行应用程序正在抓取网站上的链接,并且您只查找单个项目,那么构建字典毫无意义。构建字典需要至少一样长,就像你去的时候一样!例如,只搜索:
for link in mysite.getallLinks():
if link[0] == firstletter:
print link
如果您要进行多次搜索(而不仅仅是一个命令行参数),那么可能需要使用以下内容构建字典:
import collections
d=collections.defaultdict(list)
for link in mysite.getallLinks():
d[link[0]].append(link) # Dict of first letter -> list of links
# Print all links starting with firstletter
for link in d[firstletter]:
print link
虽然只有26个桶,但它不会产生那么大的差别。
答案 1 :(得分:1)
这里最聪明的方法是使代码最简单易读。如果列表中只有26个项目,谁会关心它用来查看它的算法?你必须真正使用某些东西,真的愚蠢,以使它对性能产生影响。
如果您真的对性能感兴趣,那么您需要对不同的选项进行基准测试。仅仅考虑复杂性并不能说明整个故事,因为它隐藏了所涉及的因素。例如,字典查找将涉及计算密钥的散列,在表中查找,然后检查相等性。对于简短列表,简单的线性搜索有时可以更高效,具体取决于散列算法的成本。
如果您的示例非常准确,那么您不能只取输入字符串的第一个字母并预测其中的URL吗? ("/extension" + letter + ".html"
)
答案 2 :(得分:0)
词典! O(1)
答案 3 :(得分:0)
如果您拥有(并且将永远拥有)少量项目,词典将是一个不错的选择。如果将来扩展URL列表,您可能实际上想要按字母对URL进行排序,然后将输入与其匹配,而不是为每个字符串编码字典。
答案 4 :(得分:0)
因为听起来你只谈论了26项,所以你可能不必太担心效率。你想出的任何东西应该足够快。
一般情况下,我建议您尝试使用最接近问题域的数据结构。例如,听起来您正在尝试将字母映射到URL。例如,这是“A”网址,这是“B”网址。在这种情况下,像dict这样的映射数据结构听起来很合适:
html_files = {
'a': '/extensionA.html',
'b': '/extensionB.html',
'c': '/extensionC.html',
}
虽然在这个确切的例子中你实际上可以欺骗它并完全跳过数据结构 - '/extension%s.html' % letter.upper()
:)