关于python排序效率的问题

时间:2009-06-17 07:03:15

标签: python sorting

好吧,我正在制作一个基于命令行的网站搜索功能实现。该网站按字母顺序列出了我需要的所有链接。

用法类似于

./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",
       ]

或者词典会更好吗?

由于

5 个答案:

答案 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():)