2016-02-08 34 views
4

字典的列表就像。得到字典中与关键字相关的值的计数python

[{'id': 19, 'success': True, 'title': u'apple'}, 
{'id': 19, 'success': False, 'title': u'some other '}, 
{'id': 19, 'success': False, 'title': u'dont know'}] 

我想有多少字典有successTrue计数。

我都试过了,

len(filter(lambda x: x, [i['success'] for i in s])) 

我怎样才能使它更优雅的使用Python的方式?

回答

9

您可以使用sum()来合计您的布尔值; True是在数值上下文1,False是0:

sum(d['success'] for d in s) 

这工作,因为Python的bool类型是int一个子类,由于历史原因。

如果你想让它明确,你可以使用条件表达式,但可读性不与在我看来改进:

sum(1 if d['success'] else 0 for d in s) 
1

另一种方式是

len(filter(lambda x:x['success'], s)) 

它可能会崩溃如果您在字典中没有'成功'

len(filter(lambda x:x.get('success',False), s)) 

可能会做这项工作

1

这里是你如何做到这一点优雅:

args = [ 
    {'id': 19, 'success': True, 'title': u'apple'}, 
    {'id': 19, 'success': False, 'title': u'some other '}, 
    {'id': 19, 'success': False, 'title': u'dont know'} 
] 


count_success = lambda x: 1 if x['success'] else 0 

success_list = map(count_success, args) 

print(sum(success_list)) # Python 3 
print sum(success_list) # Python 2 

显示:

1 

这是Python的,因为它得到。