将网站状态代码作为键返回的字典,将网站作为值返回 - py

时间:2015-01-09 01:48:42

标签: python

嘿伙计我需要一些关于这个问题的指导(.py noobie)

所以我有一个具有不同状态代码的网站列表:

url_list=["http://www.ehow.com/foo-barhow_2323550_clean-coffee-maker-vinegar.html",
          "http://www.google.com",
          "http://livestrong.com/register/confirmation/",
          "http://www.facebook.com",
          "http://www.youtube.com"]

我想要返回的是一个字典,它将网站的状态代码作为键返回,将相关网站作为值返回。这样的事情:

result= {"200": ["http://www.google.com",
                 "http://www.facebook.com",
                 "http://www.youtube.com"], 
         "301": ["http://livestrong.com/register/confirmation/"],
         "404": ["http://www.ehow.com/foo-barhow_2323550_clean-coffee-maker-vinegar.html"]}

到目前为止我所拥有的:

获取状态代码的函数:

def code_number(url):
    try:
        u = urllib2.urlopen(url)
        code = u.code
    except urllib2.HTTPError, e:
        code = e.code
    return code

一个函数应该返回字典但是不起作用 - 我被卡住的部分。基本上我不知道如何使它插入相同的状态代码超过1 url

result={}
def get_code(list_of_urls):
    for n in list_of_urls:
        code = code_number(n)
        if n in result:
            result[code] = n
        else:
            result[code] = n
    return result

请问任何想法?!谢谢

2 个答案:

答案 0 :(得分:5)

collections.defaultdict让这变得轻而易举:

import collections

def get_code(list_of_urls):
    result = collections.defaultdict(list)
    for n in list_of_urls:
        code = code_number(n)
        result[code].append(n)
    return result

不确定为什么你有result作为全局,因为它无论如何都是作为函数的结果返回的(除了真正必不可少的时候避免全局变量......本地人不仅是一种结构上更好的方法,而且访问速度更快)

无论如何,collections.defaultdict实例result将自动调用list参数,从而创建一个空列表,以初始化尚未存在的任何条目result[n]索引时;所以你可以只是附加到条目而不需要检查它是否以前存在。 是非常方便的想法!

如果由于某种原因你想要一个简单的dict作为结果(虽然我想不出任何合理的理由需要),只需return dict(result)defaultdict转换为简单的dict

答案 1 :(得分:1)

您可以使用列表初始化dict的每个键,您将向其追加返回相同状态代码的任何网站。例如:

result={}
def get_code(list_of_urls):
    for n in list_of_urls:
        code = code_number(n)
        if code in result:
            result[code].append(n)
        else:
            result[code] = [n]
    return result

我还认为条件应为if code in result,因为您的密钥是返回代码。