是否可以在列表推导中创建和引用对象?

时间:2016-08-09 12:27:08

标签: python python-2.7 list-comprehension

我有一个我想要网址的网址列表。

urls = ["http://server1:53000/cgi-bin/mapserv?map=../maps/Weather.wms.map", 
        "http://server2:53000/cgi-bin/mapserv?map=../maps/Weather.wms.map"]

我通常会写这样的东西:

servers = []
for url in urls:
    o = urlparse(url)
    servers.append(o.netloc)

然后我立即想到,“我应该把它理解为”并继续写下这个(当然这不起作用):

servers = [o.netloc() for urlparse(url) as o in urls]

python是否有办法进行这种类型的复杂理解? (也许在3.x?)

在更高的学术水平上,这种复杂的理解能否远离“pythonic”?这对我来说似乎相对直观,但我之前完全偏离了这些事情。

2 个答案:

答案 0 :(得分:8)

无需分配中介名称,只需直接访问.netloc返回值的urlparse()属性:

servers = [urlparse(url).netloc for url in urls]

以这种方式做这是一个完美的pythonic事。

答案 1 :(得分:3)

这是特定情况,根本不需要中间变量o,因为你的循环可以简化为这个

for url in urls:
    servers.append(urlparse(url).netloc)

然后可以直接转换为列表理解,如Martijn's answer

但是如果您确实需要该变量,例如因为您想多次使用它,或者想先执行一些检查而不执行urlparse(url)两次?

for url in urls:
    o = urlparse(url)
    if o is not None:
        servers.append((o.netloc, o.protocol))

在这种情况下,您可以在列表推导中嵌套生成器表达式,执行计算并声明要在外部列表解析中使用的变量:

servers = [(o.netloc, o.protocol) for o in (urlparse(url) for url in urls) 
           if o is not None]