English 中文(简体)
Pythonic List Comprehension
原标题:

This seems like a common task, alter some elements of an array, but my solution didn t feel very pythonic. Is there a better way to build urls with list comprehension?

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)

Maybe something like

links = re.findall(r"(?:https?://|www.|https?://www.)[S]+", text)
if len(links) == 0:
    return text
urls = map(lambda x : something(x), links)
最佳回答
["http://"+link if link[0:4]== www.  else link for link in links]

or

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

Notes: ("http://"+link if link[0:4]== www. else link) - this is ternary operator like ?: in C

(link[0:4]== www. and "http://"+link or link) - this has the same meaning.


On another subject: I would test for http://, not for www. Domains don t have to start with www. For instance, http://stackoverflow.com.

问题回答

If you want to go with list comprehensions, use:

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

But I actually think that the more verbose way of looping through the links that you used is easier to read. "Shorter" does not always equal "better" or "more readable".

You ll probably be better off using built-in Python functionality for dealing with urls. Assuming you stay with your current regex, I think you could rewrite this as:

from urlparse import urlsplit, urlunsplit

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

This should come out to the same thing as what you re currently doing. Also keep in mind that finding URLs using a regex is somewhat risky, ie this will return www.google.com! with the exclamation mark.

Alternatively:

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

urls = map(addHttp, links)

this is longer than using list comprehensions and the ternary operator, but IMHO it is more readable since the function name describes what it is doing, so the code is self-documenting. It is also easier to refactor e.g. if you decide to follow yu_sha s advice and not test explicitly for "www".





相关问题
Can Django models use MySQL functions?

Is there a way to force Django models to pass a field to a MySQL function every time the model data is read or loaded? To clarify what I mean in SQL, I want the Django model to produce something like ...

An enterprise scheduler for python (like quartz)

I am looking for an enterprise tasks scheduler for python, like quartz is for Java. Requirements: Persistent: if the process restarts or the machine restarts, then all the jobs must stay there and ...

How to remove unique, then duplicate dictionaries in a list?

Given the following list that contains some duplicate and some unique dictionaries, what is the best method to remove unique dictionaries first, then reduce the duplicate dictionaries to single ...

What is suggested seed value to use with random.seed()?

Simple enough question: I m using python random module to generate random integers. I want to know what is the suggested value to use with the random.seed() function? Currently I am letting this ...

How can I make the PyDev editor selectively ignore errors?

I m using PyDev under Eclipse to write some Jython code. I ve got numerous instances where I need to do something like this: import com.work.project.component.client.Interface.ISubInterface as ...

How do I profile `paster serve` s startup time?

Python s paster serve app.ini is taking longer than I would like to be ready for the first request. I know how to profile requests with middleware, but how do I profile the initialization time? I ...

Pragmatically adding give-aways/freebies to an online store

Our business currently has an online store and recently we ve been offering free specials to our customers. Right now, we simply display the special and give the buyer a notice stating we will add the ...

Converting Dictionary to List? [duplicate]

I m trying to convert a Python dictionary into a Python list, in order to perform some calculations. #My dictionary dict = {} dict[ Capital ]="London" dict[ Food ]="Fish&Chips" dict[ 2012 ]="...

热门标签