2016-08-09 5 views
3

Ich habe eine Liste von URLs, die ich die Netzstandorte möchte.Ist es möglich, Objekte im Listenverständnis zu erstellen und zu referenzieren?

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

Ich würde normalerweise nur so etwas schreiben:

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

Dann sofort dachte ich, „ich nur, dass in ein Verständnis setzen sollte“ und fuhr fort, dies zu schreiben (was natürlich nicht Arbeit):

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

Hat Python eine Möglichkeit, diese Art von komplexes Verständnis zu tun? (vielleicht in 3.x?)

Auf einer akademischen Ebene, würde diese Art von komplexes Verständnis zu weit weg von "Python" bewegen? Es scheint mir relativ intuitiv zu sein, aber ich war bisher völlig verrückt nach diesen Dingen.

Antwort

7

Es gibt keine Notwendigkeit, einen Vermittler Namen zuweisen, Zugriff nur das .netloc Attribut auf dem Rückgabewert von urlparse() direkt:

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

Es ist eine perfekt pythonic Sache, die es auf diese Weise zu tun.

+0

Das einer von denen sein würde Derp Momente. Ich habe das Gefühl, ich sollte es besser wissen. Vielen Dank! –

2

Ist dies spezieller Fall gibt es einfach keine Notwendigkeit, dass die Vermittler Variable o, als Schleife

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

auf diese vereinfacht werden könnte, die dann direkt in eine Liste Verständnis umgewandelt werden, wie in Martijn's answer.

Aber in dem Fall, dass Sie wirklich müssen diese Variable, z. weil Sie es mehr als einmal verwenden möchten oder zuerst einige Überprüfungen durchführen möchten, ohne urlparse(url) zweimal auszuführen?

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

In diesem Fall können Sie nisten einen Generator Ausdruck in Ihrer Liste Verständnis, um die Berechnung durchzuführen und zu erklären, um die Variable in der äußeren Liste Verständnis verwendet werden:

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

Ich wünschte wirklich, ich könnte zwei Antworten als akzeptiert markieren, da ich eine zweiteilige Frage gestellt habe. Das ist tatsächlich, was ich ursprünglich dachte. –

Verwandte Themen