python - 함수 - 파이썬 클래스 메소드
'in'을 사용하여 배열의 파이썬 객체 속성 일치시키기 (6)
나는 생각한다.
#!/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 value
의 if bar in value
주목하라. 이것은 목록 내포에 조건부를 충족시키는 키 - 값 쌍만 유지하도록 지시하는 수정 절이다. **이 경우 baz
는 다음을 포함하는 새로운 사전이다. 바를 담고있는 foo의 사전들 (희망적으로 나는 그 코드 예제에서 아무것도 놓치지 않았다 ... 당신은 docs.python.org 튜토리얼 과 secnetix.de 에있는리스트 comprehension 문서를 살펴 봐야 할 것이다. 미래에 궁금한 점이 있으시면 사이트를 참조하십시오.).
나는 꿈을 꾸고 있었는지 기억하지 못한다. 그러나 나는 뭔가를 허용하는 기능이 있음을 기억하는 것처럼 보인다.
foo in iter_attr(array of python objects, attribute name)
나는 문서를 살펴 봤지만 이런 종류의 것들은 분명히 열거 된 헤더에 속하지 않는다.
내가 생각한 것은 목록 내포를 사용하여 달성 할 수 있지만, 약간 더 깔끔한 방식으로이 작업을 수행 한 기능이 있다고 생각했습니다.
즉 '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 () 함수를 사용하는 것과 같은 다른 옵션이 있지만 선택할 수 있다면 이걸 가지고 갈 것입니다.
에릭 시플