Элементы 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.

5 Solutions collect form web for “Элементы Python Count в списке объектов с соответствующими атрибутами”

 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 

Я знаю, что это старый вопрос, но в наши дни одним из способов сделать это будет

 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'] 

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

По моим тестам …

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

… работает в 1,59 раза быстрее …

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

Лично я считаю, что определение функции проще для нескольких целей:

 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)) 

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

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

 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 …) ).

  • объединить два списка в словарь, если шаблон соответствует
  • python: чтение и разделение файлов в список словарей
  • Python: возвращает индекс первого элемента списка, который делает переданную функцию true
  • Удалите повторяющиеся значения и суммируйте соответствующие значения столбца
  • Python: удалить повторяющиеся элементы из вложенного списка.
  • Как группировать / подсчитывать элементы списка по диапазону
  • Python читает файл в формате DOT и возвращает список имен городов
  • Разделение вложенного списка на два списка
  • Python - лучший язык программирования в мире.