Pythonic List理解

时间:2009-12-02 07:04:47

标签: python list-comprehension

这似乎是一个常见的任务,改变了数组的某些元素,但我的解决方案并没有感觉到非常pythonic。有没有更好的方法来构建urls列表理解?

links = re.findall(r"(?:https?://|www\.|https?://www\.)[\S]+", text)
if len(links) == 0:
    return text
urls = []
for link in links:
    if link[0:4] == "www.":
        link = "http://" + link
    urls.append(link)

也许像

links = re.findall(r"(?:https?://|www\.|https?://www\.)[\S]+", text)
if len(links) == 0:
    return text
urls = map(lambda x : something(x), links)

4 个答案:

答案 0 :(得分:4)

如果您想使用列表推导,请使用:

urls = ['http://' + link if link.startswith('www.') else link for link in links]

但实际上我认为循环使用您使用的链接的更冗长的方式更容易阅读。 “较短”并不总是等于“更好”或“更具可读性”。

答案 1 :(得分:1)

["http://"+link if link[0:4]=='www.' else link for link in links]

[link[0:4]=='www.' and "http://"+link or link for link in links]

注意:  ("http://"+link if link[0:4]=='www.' else link) - 这是三元运算符,如?:in C

(link[0:4]=='www.' and "http://"+link or link) - 这具有相同的含义。


关于另一个主题:我会测试http://,而不是www。域名不必以www开头。例如,http://stackoverflow.com

答案 2 :(得分:1)

使用内置的Python功能处理网址可能会更好。假设你继续使用当前的正则表达式,我认为你可以将其重写为:

from urlparse import urlsplit, urlunsplit

links = re.findall("(?:https?://|www\.|https?://www\.)[\S]+", text)
urls = [urlunsplit(urlsplit(link, 'http')) for link links]

这应该与你目前正在做的事情相同。另外请记住,使用正则表达式查找URL有点风险,即这将返回www.google.com!带有感叹号。

答案 3 :(得分:0)

可替换地:

def addHttp(url):
    if url[0:4] == "www.":
        url = "http://" + url
    return url

urls = map(addHttp, links)

这比使用列表推导和三元运算符更长,但恕我直言,因为函数名称描述了它正在做什么,所以它更具可读性,因此代码是自我记录的。例如,重构也更容易如果您决定遵循yu_sha的建议而不是明确测试“www”。