使用给定的属性值计算列表中的元素

时间:2015-02-20 05:30:54

标签: python

我使用的是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,我觉得这是一个完美的用例 - 但是我不知道如何在这里使用它如何做那?

3 个答案:

答案 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
>>>