Подтвердить что ты не робот

Элементы Python 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")]

Теперь, какая самая простая функция для подсчета количества объектов в этом списке, которые соответствуют аргументу на основе их атрибутов? Например, возвращает 2 для Person.Gender == "F" или Person.Age < 20.

4b9b3361

Ответ 1

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

Ответ 2

Я знаю, что это старый вопрос, но в наши дни одним способом 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']

Ответ 3

Я обнаружил, что использование понимания списка и получение его длины было быстрее, чем использование sum().

Согласно мои тесты...

len([p for p in PeopleList if p.Gender == 'F'])

... выполняется в 1,59 раза быстрее, чем...

sum(p.Gender == "F" for p in PeopleList)

Ответ 4

Лично я считаю, что определение функции проще при многократном использовании:

def count(seq, pred):
    return sum(1 for v in seq if pred(v))

print(count(PeopleList, lambda p: p.Gender == "F"))
print(count(PeopleList, lambda p: p.Age < 20))

В частности, если вы хотите повторно использовать запрос.

Ответ 5

Я предпочитаю это:

def count(iterable):
    return sum(1 for _ in iterable)

Затем вы можете использовать его следующим образом:

femaleCount = count(p for p in PeopleList if p.Gender == "F")

который является дешевым (не создает бесполезные списки и т.д.) и отлично читается (я бы сказал лучше, чем sum(1 for … if …) и sum(p.Gender == "F" for …)).