Понимание списка Pythonic - PullRequest
       19

Понимание списка Pythonic

2 голосов
/ 02 декабря 2009

Это похоже на обычную задачу, изменить некоторые элементы массива, но мое решение не выглядело очень питонным. Есть ли лучший способ построить 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 ]

4 голосов
/ 02 декабря 2009

Если вы хотите использовать списки, используйте:

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

Но на самом деле я думаю, что более подробный способ циклического перемещения по ссылкам, которые вы использовали, легче читать. «Короче» не всегда равно «лучше» или «более читабельно».

1 голос
/ 02 декабря 2009

Вам, вероятно, будет лучше использовать встроенные функции Python для работы с URL-адресами. Предполагая, что вы останетесь со своим текущим регулярным выражением, я думаю, вы могли бы переписать это как:

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! с восклицательным знаком.

1 голос
/ 02 декабря 2009
["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) - это как троичный оператор как?: В C

(link[0:4]=='www.' and "http://"+link or link) - это имеет то же значение.


По другому вопросу: я бы проверил на http://, не на www Домены не должны начинаться с www. Например, http://stackoverflow.com.

0 голосов
/ 02 декабря 2009

В качестве альтернативы:

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

urls = map(addHttp, links)

это длиннее, чем использование списочных представлений и троичного оператора, но ИМХО оно более читабельно, поскольку имя функции описывает, что она делает, поэтому код самодокументируется. Также легче выполнить рефакторинг, например, если вы решите последовать совету yu_sha и не проверять явно «www».

...