2016-02-08 32 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的,因爲它得到。