具有匹配属性的对象列表中的Python计数元素

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"或P​​erson.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)

  • 我更喜欢`sum(如果p.Gender =="F",则为PeopleList中的p为1)因为它没有滥用bool子类int的事实. (23认同)
  • @wim http://stackoverflow.com/questions/3174392/is-it-pythonic-to-use-bools-as-ints (5认同)
  • 但这并不十分清楚.也许对于计算机科学人员以及那些在bools之前使用python甚至存在于语言中的人来说,这是显而易见的,但对于具有数学思维的人来说,"真实"和"数字1"在概念上是非常不同的对象并不明显.条件的总和是一个心理障碍,与阅读直接理解相比,它需要额外的思考时刻. (5认同)
  • 我必须在这里同意@wim.即使是一个长期的python程序员,我花了一些时间来评估使用sum语句做了什么.我发现`sum(如果p.Gender =="F",则为PeopleList中的p为1)更明确. (3认同)
  • 使用`False`和`True`作为列表索引的@monkut Guido States非常好.他还说了其他如此明确的习语.这也是'False`和`True`的明确用法 (3认同)
  • 实际上,这句话完美地总结了这一点:*“当时有相当多的阻力,因为我们许多人担心 Python 新手会使用新类型和常量来限制该语言的能力,但 Guido 坚持认为我们只是被悲观:没有人会如此糟糕地理解Python,例如,避免完全自然地使用False和True作为列表索引,或**求和**,或其他此类**完全清晰且有用的习语。** “* (2认同)

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)


Alf*_*lfe 5

我更喜欢这个:

\n\n
def count(iterable):\n    return sum(1 for _ in iterable)\n
Run Code Online (Sandbox Code Playgroud)\n\n

然后你可以像这样使用它:

\n\n
femaleCount = count(p for p in PeopleList if p.Gender == "F")\n
Run 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)。

\n


Web*_*tor 5

我发现使用列表理解并获得其长度比使用更快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)

  • 除非您也测试`sum([PeopleList中p中的p.Gender ==“ F”])”,然后发布微小,中等和巨大数据的结果,否则这不是一个公平的测试 (2认同)