2016-08-09 5 views
3

私はネットの場所を望むURLのリストを持っています。リストの理解の中でオブジェクトを作成して参照することは可能ですか?

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] 

この種類の複雑な理解を行う方法はありますか? (おそらく3.x?)

これ以上の学問レベルでは、このタイプの複雑な理解は「ピジョンソニック」から離れすぎてしまうでしょうか?それは私には比較的直感的だと思われますが、私は前にこれらのことを完全に根本から外してきました。

答えて

7

仲介名に割り当てる必要はありませんが、ちょうど直接urlparse()の戻り値に.netloc属性にアクセス:

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

それはこのようにそれを行うには完全にニシキヘビことです。

+0

これは、これらのものであろう瞬間を遅らせる。私は私が 'よく知っているべきであるように感じる。ありがとうございました! –

2

は、あなたのループは、直接Martijn's answerのように、リストの内包に変換することができる。この

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

に簡素化することができたとして仲介変数oの必要は、単に存在しない、この特定のケースです。

実際にが必要な場合は、という変数が必要です。 1回以上使用するか、またはurlparse(url)を2回実行せずにいくつかのチェックを最初に実行したいからです。この場合

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] 
+0

私は二部構成の質問をしてから2つの回答を受け入れることができました。これは確かに私が元々考えていたものです。 –

関連する問題