在dicts列表中查找值匹配值

时间:2013-04-04 00:29:43

标签: python

我有一个如下所示的词典列表:

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?

谢谢, 富

5 个答案:

答案 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']以获得相应的字典条目。