一行返回包含另一个键值的列表中第一个dict中的dict键的值

时间:2014-12-13 05:49:04

标签: python dictionary

我有一个dicts列表:

DDD=[
  {'name': 'dog', 'port': 2020, 'id': 123},
  {'name': 'cat', 'port': 4242, 'id': 456},
  {'name': 'mouse', 'port': 3333, 'id': 789}
]

我正在寻找一行python命令来获取'port'值为'name'的dict的'mouse'值。

我意识到实践中可能存在多个值,只需要第一个值。 (我知道他们是独一无二的)

类似的东西:

d['port'] for d in DDD if d['name'] is 'mouse'

我很高兴它成为一个列表并抓住第一个[0]

4 个答案:

答案 0 :(得分:4)

对OP自己的解决方案进行一点改进

next((d['port'] for d in DDD if d['name']=='mouse'), None)

这种生成器解决方案具有在列表理解上短路的优点。 None是默认值,如果它找不到任何内容而不是引发错误,否则您只需在next / try中单独运行except并抓住如果这更适合你,那就是错误。

答案 1 :(得分:3)

为避免潜在的IndexError,您可以

([d['port'] for d in DDD if d['name']=='mouse'] or [None])[0]

这将获得列表推导的第一个元素,除非列表推导导致空列表,在这种情况下,我们获得[None]运算符后面的or列表的内容。

但是如果真正的DDD很大并且你想要查找大量的端口号,那么遵循abarnert的建议可能是一个好主意,并创建一个如下所示的字典:{&#39 ;鼠标':3333,'狗':2020,' cat':4242}因为dict查找比扫描列表并取消引用其中的dicts要高效得多。 / p>

以下是如何在旧版本的Python中进行转换:

DDDD = dict((d['name'], d['port']) for d in DDD)

在更现代的版本中,你也可以这样做:

DDDD = {d['name']: d['port'] for d in DDD}

答案 2 :(得分:2)

自己回答。这对我有用:

[d['port'] for d in DDD if d['name']=='mouse'][0]

感谢http://docs.python.org/2/tutorial/datastructures.html#list-comprehensions

然而,如果找不到值,那将返回IndexError异常,所以这就是我现在正在做的事情:

exec "try: return [d['port'] for d in DDD if d['name']=='mouse'][0]\nexcept: return 0"

答案 3 :(得分:0)

试试这个:

>>> DDD=[
...   {'name': 'dog', 'port': 2020, 'id': 123},
...   {'name': 'cat', 'port': 4242, 'id': 456},
...   {'name': 'mouse', 'port': 3333, 'id': 789}
... ]
>>> filter(lambda x: x['name']=='mouse',DDD)[0]['port']
3333