我有一个User对象,有两个布尔属性,如下所示:
class User(object):
def __init__(self, a, b):
self.a = a # Always a bool
self.b = b # Always a bool
我有一个这些对象的列表,名为user_list
,我想得到有多少对象具有a==True、a==False、b==True和b==False的频率计数。在
我最初的方法是使用集合。计数器,但这需要在列表中循环两次:
^{pr2}$我也想过只使用4个计数器,但这很难看,而且没有Python的感觉:
a_true_count = 0
a_false_count = 0
b_true_count = 0
b_false_count = 0
for u in user_list:
if u.a:
a_true_count += 1
else:
a_false_count += 1
if u.b:
b_true_count += 1
else:
a_false_count += 1
print a_true_count, a_false_count, b_true_count, b_false_count
有没有更有效的方法?输出可以是任何东西:4个单独的变量,一个包含值的dict,一个list,tuple,任何东西,只要它包含这4个值。在
提前谢谢!在
为什么不使用两个计数器,并从
user_list
的长度中减去来找到另外两个值呢?在a_false_count = len(user_list) - a_true_count
b_false_count = len(user_list) - b_true_count
这种显式循环可能是最有效的解决方案,但如果您正在寻找更简洁的代码,您可以尝试
filter()
:我认为使用
collections.Counter
是正确的想法,只需使用一个Counter
和一个循环,以更通用的方式进行:相关问题 更多 >
编程相关推荐