4

次のような辞書のリストがあります。

serv=[{'scheme': 'urn:x-esri:specification:ServiceType:DAP',
  'url': 'http://www.esrl.noaa.gov/psd/thredds/dodsC/Datasets/air.mon.anom.nobs.nc'},
 {'scheme': 'urn:x-esri:specification:ServiceType:WMS',
  'url': 'http://www.esrl.noaa.gov/psd/thredds/wms/Datasets/air.mon.anom.nobs.nc?service=WMS&version=1.3.0&request=GetCapabilities'},
 {'scheme': 'urn:x-esri:specification:ServiceType:WCS',
  'url': 'http://ferret.pmel.noaa.gov/geoide/wcs/Datasets/air.mon.anom.nobs.nc?service=WCS&version=1.0.0&request=GetCapabilities'}]

に対応する URL を検索したいのですが、これは、キーが値を持つこのリストから辞書ServiceType:WMSでキーの値を見つけることを意味します。urlschemeurn:x-esri:specification:ServiceType:WMS

だから私はこれがうまくいく:

for d in serv:
    if d['scheme']=='urn:x-esri:specification:ServiceType:WMS':
        url=d['url']
print url

生産する

http://www.esrl.noaa.gov/psd/thredds/wms/Datasets/air.mon.anom.nobs.nc?service=WMS&version=1.3.0&request=GetCapabilities

しかし、Raymond Hettinger の PyCon トークを見たところ、最後に彼は、文として言えるのであれば、Python の 1 行で表現する必要があると述べています。

おそらく1行のPythonで同じ結果を達成する、より美しく慣用的な方法はありますか?

ありがとう、リッチ

4

5 に答える 5

2

これを 2 行に分割して、URL 取得からターゲットを分離します。これは、ターゲットが時間とともに変化する可能性があるためです。1 行のコードが続きます。

このタイプのすべてのスキームを検索したいので、in代わりに使用します。==これにより、柔軟性と可読性が向上します。これにより、不要な他のスキームもキャッチされないことが前提となります。しかし、説明から、これは望ましい機能です。

target = "ServiceType:WMS"
url = [d['url'] for d in serv if target in d['scheme']]

また、これは、複数の一致がある場合、すべての場合にリストを返すため、これurlを使用するコードでループする必要があることに注意してください。

于 2013-04-05T15:10:52.113 に答える
1

私はより関数型プログラミングを自分の仕事に取り込もうとしてきたので、非常に単純な関数型の方法を次に示します。

needle='urn:x-esri:specification:ServiceType:WMS'
url = filter( lambda d: d['scheme']==needle, serv )[0]['url']

filterブール値とフィルタリングするリストを返す関数を引数として取ります。ブール値を返す関数 (この場合は、その場で定義されTrueた I) に渡されたときに返される要素のリストを返します。lambdaしたがって、最終的に URL を取得するには、filter返されるリストの 0 番目の要素を取得する必要があります。これは目的の URL を含む dict である['url']ため、式全体の末尾にタグを付けて、対応する辞書エントリを取得できます。

于 2013-04-04T00:45:35.317 に答える
1

これはどう?

urls = [d['url'] for d in serv if d['scheme'] == 'urn:x-esri:specification:ServiceType:WMS']

print urls # ['http://www.esrl.noaa.gov/psd/thredds/wms/Datasets/air.mon.anom.nobs.nc?service=WMS&version=1.3.0&request=GetCapabilities']

d['url']リストに追加されている場所で、コードが行っているのと同じことを行っています-urlsそれらがで終わる場合WMS

else 句を追加することもできます。

urls = [i['url'] for i in serv if i['scheme'].endswith('WMS') else pass]
于 2013-04-04T00:32:30.253 に答える