我使用的是Python 2.7。我有一个对象列表,每个对象都包含一个名为vote的属性,其值可以是yes或no,我想计算是和否的数量。一种方法是:
list = [ {vote:'yes'}, {vote:'no'}, {vote:'yes'} ] #...
numYesVotes = len([x for x in list if x.vote=='yes'])
numNoVotes = len([x for x in list if x.vote=='no'])
但是对我来说,构建这些列表只是为了得到他们的长度而且看起来非常浪费/效率低
第一个问题:我是对的吗?简单地循环遍历列表并增加计数器变量会不会更有效率?即:
numYesVotes = numNoVotes = 0;
for x in list:
if x.vote == 'yes':
numYesVotes++
else:
numNoVotes++
还是列表推导有什么能让它们在这里变得更有效率?
第二个问题:我只是学习使用lambdas,我觉得这是一个完美的用例 - 但是我不知道如何在这里使用它如何做那?
答案 0 :(得分:4)
请参阅Counter
Counter(x.vote for x in mylst)
修改强>
示例:
yn = Counter("yes" if x%2 else "no" for x in range(10))
print(yn["yes"],yn["no"])
答案 1 :(得分:1)
请注意,执行速度更快:
sum(1 for x in L if x.vote=='yes')
比:
len([x for x in L if x.vote=='yes'])
因为不必创建列表。
答案 2 :(得分:0)
lambda
表格;
t =lambda lst: len([ v for x in lst for k,v in x.items() if v=='yes'])
#print (t(mylst))
mylst
是您要检查其中是或否的列表。使用key-dict方法。
演示;
mylst = [ {"vote":'yes'}, {"vote":'no'}, {"vote":'yes'} ]
t =lambda lst: len([ v for x in lst for k,v in x.items() if v=='yes'])
print (t(mylst))
>>>
2
>>>