python - 함수 - 파이썬 클래스 메소드




'in'을 사용하여 배열의 파이썬 객체 속성 일치시키기 (6)

나는 꿈을 꾸고 있었는지 기억하지 못한다. 그러나 나는 뭔가를 허용하는 기능이 있음을 기억하는 것처럼 보인다.

foo in iter_attr(array of python objects, attribute name)

나는 문서를 살펴 봤지만 이런 종류의 것들은 분명히 열거 된 헤더에 속하지 않는다.


나는 생각한다.

#!/bin/python
bar in dict(Foo)

당신이 생각하고있는 것입니다. 특정 키가 파이썬 (파이썬 버전의 해시 테이블)에 사전 내에 존재하는지 확인하려고 할 때, 체크 할 수있는 두 가지 방법이 있습니다. 첫 번째는 has_key() 메소드가 사전에 첨부되고 두 번째가 위에 주어진 예제이다. 부울 값을 반환합니다.

귀하의 질문에 대답해야합니다.

그리고 이제는 주제를 조금 벗어나 이전에 주어진 목록 이해력 에 연결합니다 (좀 더 명확하게하기 위해). List Comprehensions 은 수정자를 가진 for for 루프 에서리스트를 구성합니다. 예를 들어 (약간 명확하게하기 위해) 목록 작성 in dict 언어 구조를 사용하는 방법은 다음 in dict 같습니다.

2 차원 사전 foo 가 있고 키 bar 포함하는 2 차 사전 만 원한다고 가정 해보십시오. 그렇게하기위한 상대적으로 간단한 방법은 다음과 같이 조건부와 함께 목록 이해력 을 사용하는 것입니다.

#!/bin/python
baz = dict([(key, value) for key, value in foo if bar in value])

문 **의 끝에 if bar in valueif bar in value 주목하라. 이것은 목록 내포에 조건부를 충족시키는 키 - 값 쌍만 유지하도록 지시하는 수정 절이다. **이 경우 baz 는 다음을 포함하는 새로운 사전이다. 바를 담고있는 foo의 사전들 (희망적으로 나는 그 코드 예제에서 아무것도 놓치지 않았다 ... 당신은 docs.python.org 튜토리얼secnetix.de 에있는리스트 comprehension 문서를 살펴 봐야 할 것이다. 미래에 궁금한 점이 있으시면 사이트를 참조하십시오.).


내가 생각한 것은 목록 내포를 사용하여 달성 할 수 있지만, 약간 더 깔끔한 방식으로이 작업을 수행 한 기능이 있다고 생각했습니다.

즉 'bar'는 'id'속성을 가진 객체 목록입니다.

신화 적 기능적 방식 :

foo = 12
foo in iter_attr(bar, 'id')

목록 이해 방법 :

foo = 12
foo in [obj.id for obj in bar]

돌이켜 보면 목록 이해법은 어쨌든 꽤 깔끔합니다.


당신은 항상 당신 자신을 쓸 수 있습니다 :

def iterattr(iterator, attributename):
    for obj in iterator:
        yield getattr(obj, attributename)

터플,리스트 등 무엇이든간에 반복되는 모든 것을 처리 할 것이다.

저는 파이썬을 좋아합니다. 이것은 매우 간단하고 더 이상 필요한 것보다 번거롭지 않습니다. 사용 재료는 매우 우아합니다.


원격으로 괜찮은 크기의 것을 찾으려고한다면, 가장 좋은 방법은 사전이나 세트를 사용하는 것입니다. 그렇지 않으면 기본적으로 반복자의 모든 요소를 ​​반복하여 원하는 것까지 가져와야합니다.

이것이 반드시 성능에 민감한 코드가 아니라면 목록 이해 방법이 효과적 일 것입니다. 그러나 iterator의 모든 요소를 ​​검사하고 다시 원하는 값을 찾을 때까지 다시 돌아 가기 때문에 상당히 비효율적입니다.

Python에는 가장 효율적인 해싱 알고리즘 중 하나가 있습니다. 이점을 이용하십시오.


당신이 생각하고있는 기능은 아마 operator.attrgettter 입니다. 예를 들어, 각 객체의 "id"속성의 값을 포함하는 목록을 얻으려면 다음을 수행하십시오.

import operator
ids = map(operator.attrgetter("id"), bar)

목록에 id == 12 인 객체가 있는지 확인하려면 다음과 같이 깔끔하고 효율적으로 (즉, 불필요하게 전체 목록을 반복하지 않음) :

any(obj.id == 12 for obj in bar)

lazy 반복을 유지하면서 attrgetter와 함께 'in'을 사용하려면 다음을 수행하십시오.

import operator,itertools
foo = 12
foo in itertools.imap(operator.attrgetter("id"), bar)


아니, 너 꿈꾸지 않았어. 파이썬은 목록을 매우 우아하게 조작 할 수있는 매우 우수한 목록 이해 시스템을 가지고 있으며, 정확히 무엇을 달성하고 싶은지에 따라 몇 가지 방법으로 수행 할 수 있습니다. 본질적으로, 당신이하고있는 일은 "목록의 항목이 criteria.matches 일 때"라고 말하는 것입니다. 그리고 그 결과로부터 결과를 반복하거나 결과를 새로운 목록으로 덤프 할 수 있습니다.

나는 꽤 고급스럽고 더 똑똑하기 때문에 여기에 Python 으로 다이브 (Dive Into Python) 의 예를 들어 보겠습니다. 여기에서는 디렉토리에있는 파일 목록을 얻은 다음 정규 표현식 조건과 일치하는 모든 파일 목록을 필터링합니다.

    files = os.listdir(path)                               
    test = re.compile("test\.py$", re.IGNORECASE)          
    files = [f for f in files if test.search(f)]

정규 표현식없이이 작업을 수행 할 수 있습니다. 예를 들어, 끝에있는 표현이 일치하는 경우 true를 반환하는 경우에 사용할 수 있습니다. filter () 함수를 사용하는 것과 같은 다른 옵션이 있지만 선택할 수 있다면 이걸 가지고 갈 것입니다.

에릭 시플







iteration