我有一个我想要网址的网址列表。
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”?这对我来说似乎相对直观,但我之前完全偏离了这些事情。
答案 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]