Fac*_*fMu 36 python attributes list object count
我试图找到一种简单快速的方法来计算列表中符合条件的对象数量.例如
class Person:
def __init__(self, Name, Age, Gender):
self.Name = Name
self.Age = Age
self.Gender = Gender
# List of People
PeopleList = [Person("Joan", 15, "F"),
Person("Henry", 18, "M"),
Person("Marg", 21, "F")]
Run Code Online (Sandbox Code Playgroud)
现在,计算此列表中与基于其属性的参数匹配的对象数量的最简单函数是什么?例如,为Person.Gender =="F"或Person.Age <20返回2.
jam*_*lak 46
class Person:
def __init__(self, Name, Age, Gender):
self.Name = Name
self.Age = Age
self.Gender = Gender
>>> PeopleList = [Person("Joan", 15, "F"),
Person("Henry", 18, "M"),
Person("Marg", 21, "F")]
>>> sum(p.Gender == "F" for p in PeopleList)
2
>>> sum(p.Age < 20 for p in PeopleList)
2
Run Code Online (Sandbox Code Playgroud)
lon*_*win 12
我知道这是一个老问题,但是现在有一种stdlib方法可以做到这一点
from collections import Counter
c = Counter(getattr(person, 'gender') for person in PeopleList)
# c now is a map of attribute values to counts -- eg: c['F']
Run Code Online (Sandbox Code Playgroud)
我更喜欢这个:
\n\ndef count(iterable):\n return sum(1 for _ in iterable)\nRun Code Online (Sandbox Code Playgroud)\n\n然后你可以像这样使用它:
\n\nfemaleCount = count(p for p in PeopleList if p.Gender == "F")\nRun Code Online (Sandbox Code Playgroud)\n\n这是便宜的(不会创建无用的列表等)并且完全可读(我想说比两者都好sum(1 for \xe2\x80\xa6 if \xe2\x80\xa6))sum(p.Gender == "F" for \xe2\x80\xa6)。
我发现使用列表理解并获得其长度比使用更快sum().
根据我的测试 ......
len([p for p in PeopleList if p.Gender == 'F'])
Run Code Online (Sandbox Code Playgroud)
...运行速度是...的1.59倍
sum(p.Gender == "F" for p in PeopleList)
Run Code Online (Sandbox Code Playgroud)