我有一个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]
。
答案 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