我有一个如下所示的词典列表:
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'}]
我希望找到与ServiceType:WMS
对应的网址,这意味着从url
密钥具有值scheme
的列表中查找字典中urn: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's PyCon talk,最后他说,如果你可以把它说成一个句子,它应该用一行Python来表达。
有没有一种更美观,惯用的方法来实现相同的结果,也许是用一行Python?
谢谢, 富
答案 0 :(得分:2)
如果您只对一个网址感兴趣,那么您可以在serv
上构建一个生成器,并使用next
使用默认值来查找未找到匹配项的情况,例如:< / p>
url = next((dct['url'] for dct in serv if dct['scheme'] == 'urn:x-esri:specification:ServiceType:WMS'), 'default URL / not found')
答案 1 :(得分:2)
您列出的serv
数组看起来像是一个字典映射到URL的方案,但它没有这样表示。但是,您可以使用列表推导轻松将其转换为dict
,然后使用常规字典查找:
url = dict([(d['scheme'],d['url']) for d in serv])['urn:x-esri:specification:ServiceType:WMS']
当然,您可以保存字典版本以备将来使用(代价是使用两行):
servdict = dict([(d['scheme'],d['url']) for d in serv])
url = servdict['urn:x-esri:specification:ServiceType:WMS']
答案 2 :(得分:2)
我会把它分成两行,将目标与url检索分开。这是因为您的目标可能会及时更改,因此不应该硬连线。单行代码如下。
我会使用in
代替==
,因为我们要搜索此类型的所有方案。这增加了更多的灵活性和可读性,假设这也不会捕获其他不需要的方案。但是根据描述,这是所需的功能。
target = "ServiceType:WMS"
url = [d['url'] for d in serv if target in d['scheme']]
另外,请注意,这会在所有情况下返回一个列表,以防有多个匹配,因此您必须在使用此代码的代码中循环url
。
答案 3 :(得分: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]
答案 4 :(得分:1)
我一直在尝试将更多功能性编程用于我自己的工作中,所以这是一个非常简单的功能方式:
needle='urn:x-esri:specification:ServiceType:WMS'
url = filter( lambda d: d['scheme']==needle, serv )[0]['url']
filter
将一个函数作为参数,该函数返回一个布尔值和一个要过滤的列表。它返回一个元素列表,这些元素在传递给布尔返回函数时返回True
(在这种情况下,我是动态定义的lambda
)。因此,要最终获取url,我们必须获取filter
返回的列表中的第0个元素。由于这是包含我们想要的url的dict,我们可以在整个表达式的末尾标记['url']
以获得相应的字典条目。