list 파이썬 - 일치하는 속성이있는 객체 목록의 Python 개수 요소





내장함수 리스트 (6)


나는 이것을 선호한다.

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 …) )보다 더 좋다고 말할 수있다.

나는 조건에 일치하는 목록의 객체 수를 계산하는 간단하고 빠른 방법을 찾으려고합니다. 예

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

이제이 목록에서 해당 속성을 기반으로하는 인수와 일치하는 개체의 수를 계산하는 가장 간단한 함수는 무엇입니까? 예를 들어, Person.Gender == "F"또는 Person.Age <20의 경우 2를 반환합니다.




개인적으로 나는 함수를 정의하는 것이 여러 용도에 비해 더 단순하다고 생각한다.

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

특히 쿼리를 다시 사용하려는 경우




나는 이것이 오래된 질문이지만 요즘은 이렇게 할 수있는 한 가지 방법이 될 것이라고 생각한다.

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



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



나는리스트의 이해력을 사용하고 길이를 얻는 것이 sum() 사용하는 것보다 빠르다는 것을 발견했다.

내 검사 결과 에 따르면 ...

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

... 1.59 배 빠른 속도로 실행됩니다.

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



이 문제는 String 메서드 에서 논의되었지만 마침내 Python-Dev 라이브러리에서 스레드되고 Guido가 받아 들였습니다. 이 스레드는 1999 년 6 월에 시작되었으며 str.join 은 2000 년 9 월에 릴리스 된 Python 1.6에 포함되어 있습니다 (유니 코드 지원). Python 2.0 ( join 포함한 str 메소드 지원)은 2000 년 10 월에 릴리스되었습니다.

  • 이 스레드에는 네 가지 옵션이 제안되었습니다.
    • str.join(seq)
    • seq.join(str)
    • seq.reduce(str)
    • 내장 함수로 결합
  • Guido는 list s, tuple s뿐만 아니라 모든 시퀀스 / iterables를 지원하고자했다.
  • seq.reduce(str) 은 새로운 comers에게는 어렵습니다.
  • seq.join(str) 은 시퀀스에서 str / unicode 로의 예기치 않은 종속성을 도입합니다.
  • 내장 함수 인 join() 은 특정 데이터 유형 만 지원합니다. 그래서 내장 된 네임 스페이스를 사용하는 것은 좋지 않습니다. join() 이 많은 데이터 유형을 지원한다면 __add__ 메소드를 사용하여 구현하면 최적화 구현을 만드는 것이 어려울 것입니다. __add__ O (n²)입니다.
  • sep 문자열 ( sep )은 생략해서는 안됩니다. 암시 적보다 암묵적인 것이 낫습니다.

이 스레드에는 다른 이유가 없습니다.

다음은 몇 가지 추가 생각입니다 (내 자신과 내 친구의 것).

  • 유니 코드 지원이 이루어졌지만 최종적이지는 않았습니다. 당시 UTF-8은 UCS2 / 4를 대체 할 가능성이 가장 컸습니다. UTF-8 문자열의 전체 버퍼 길이를 계산하려면 문자 코딩 규칙을 알아야합니다.
  • 당시 파이썬은 사용자가 시퀀스와 비슷한 (반복 가능한) 클래스를 생성 할 수있는 일반적인 시퀀스 인터페이스 규칙을 이미 결정했다. 그러나 파이썬은 2.2까지 빌트인 타입을 확장하는 것을 지원하지 않았다. 그 당시 기본 iterable 클래스 (다른 주석에 언급되어 있음)를 제공하기가 어려웠습니다.

Guido의 결정은 str.join(seq) 결정하는 역사적인 메일에 기록됩니다.

웃긴,하지만 맞을 것 같아! 배리, 가서 ...
- 길드 반 로섬







python list object attributes count