'in'을 사용하여 배열에 있는 Python 객체의 속성을 일치시킵니다.

StackOverflow https://stackoverflow.com/questions/683

  •  08-06-2019
  •  | 
  •  

문제

꿈을 꾸고 있었는지 아닌지는 기억나지 않지만 다음과 같은 기능을 허용하는 기능이 있었던 것으로 기억됩니다.

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

문서를 살펴봤지만 이런 종류의 내용은 명백하게 나열된 헤더에 속하지 않습니다.

도움이 되었습니까?

해결책

목록 이해를 사용하면 임시 목록이 작성되며, 검색 중인 시퀀스가 ​​클 경우 메모리를 모두 소모할 수 있습니다.시퀀스가 크지 않더라도 목록을 구축한다는 것은 이전 시퀀스 전체를 반복하는 것을 의미합니다. in 검색을 시작할 수 있습니다.

생성기 표현식을 사용하면 임시 목록을 피할 수 있습니다.

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

지금은 obj.id == 12 시작 근처 bar, 경우에도 검색 속도가 빨라집니다. bar 무한히 길어요.

@Matt가 제안한 것처럼 사용하는 것이 좋습니다. hasattr 안에 있는 객체 중 하나라도 있다면 bar 누락될 수 있습니다. id 기인하다:

foo = 12
foo in (obj.id for obj in bar if hasattr(obj, 'id'))

다른 팁

특정 속성을 가진 개체 목록을 얻으려고 하시나요?그렇다면, 목록 이해 이 작업을 수행하는 올바른 방법입니다.

result = [obj for obj in listOfObjs if hasattr(obj, 'attributeName')]

언제든지 직접 작성할 수 있습니다.

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

튜플, 리스트 등 반복되는 모든 항목에서 작동합니다.

나는 파이썬을 좋아합니다. 파이썬은 이런 것들을 매우 간단하게 만들고 꼭 필요한 것 이상으로 번거롭지 않게 만들어주며, 사용하는 데 있어 이와 같은 것은 매우 우아합니다.

아니, 당신은 꿈을 꾸고 있지 않았습니다.Python에는 목록을 매우 우아하게 조작할 수 있는 매우 뛰어난 목록 이해 시스템이 있으며, 정확히 달성하려는 작업에 따라 몇 가지 방법으로 이 작업을 수행할 수 있습니다.본질적으로, 당신이 하고 있는 일은 "기준이 일치하는 경우 목록의 항목에 대해"라고 말하는 것입니다. 그러면 결과를 반복하거나 결과를 새 목록에 덤프할 수 있습니다.

나는 다음의 예를 들겠습니다. Python에 뛰어들다 여기 꽤 우아하고 그 사람들이 나보다 더 똑똑하거든요.여기에서는 디렉터리의 파일 목록을 가져온 다음 정규식 기준과 일치하는 모든 파일의 목록을 필터링합니다.

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

예를 들어, 마지막 식이 일치 항목에 대해 true를 반환하는 경우 정규식 없이 이 작업을 수행할 수 있습니다.filter() 함수를 사용하는 것과 같은 다른 옵션이 있지만 선택할 예정이라면 이것을 사용하겠습니다.

에릭 시플

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

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

목록에 id == 12인 객체가 포함되어 있는지 확인하려면 깔끔하고 효율적입니다(예:전체 목록을 불필요하게 반복하지 않습니다. 이를 수행하는 방법은 다음과 같습니다.

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

목록의 지연 반복을 유지하면서 속성과 함께 'in'을 사용하려는 경우:

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

제가 생각한 것은 리스트 컴프리헨션을 이용해서 구현할 수 있는데, 이를 좀 더 깔끔하게 해주는 함수가 있는 것 같았습니다.

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

신화적인 기능적 방식:

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

목록 이해 방법:

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

돌이켜보면 목록 이해 방식은 어쨌든 매우 깔끔합니다.

적당한 크기의 무엇이든 검색할 계획이라면 사전이나 세트를 사용하는 것이 가장 좋습니다.그렇지 않으면 기본적으로 원하는 요소에 도달할 때까지 반복자의 모든 요소를 ​​반복해야 합니다.

이것이 반드시 성능에 민감한 코드가 아닌 경우 목록 이해 방식이 작동해야 합니다.그러나 반복자의 모든 요소를 ​​조사한 다음 원하는 것을 찾을 때까지 다시 다시 조사하기 때문에 상당히 비효율적이라는 점에 유의하십시오.

파이썬은 가장 효율적인 해싱 알고리즘 중 하나를 가지고 있다는 것을 기억하세요.당신의 이점을 활용하십시오.

제 생각에는:

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

당신이 생각하고 있는 것입니다.Python(Python의 해시 테이블 버전)의 사전 내에 특정 키가 존재하는지 확인하려는 경우 두 가지 방법으로 확인할 수 있습니다.첫 번째는 has_key() 메소드는 사전에 첨부되어 있으며 두 번째는 위에 제공된 예입니다.부울 값을 반환합니다.

그러면 귀하의 질문에 답할 수 있을 것입니다.

이제 이것을 연결하기에는 약간 주제에서 벗어났습니다. 목록 이해 (더 명확하게 하기 위해) 이전에 제공된 답변입니다. 목록 이해 기본부터 목록을 구성 for 루프 수정자와 함께.(약간 명확히 하기 위해) 예를 들어, in dict 언어 구조 목록 이해:

2차원 사전이 있다고 가정해 보세요. foo 키를 포함하는 두 번째 차원 사전만 원합니다. bar.비교적 간단한 방법은 다음을 사용하는 것입니다. 목록 이해 다음과 같이 조건문을 사용합니다.

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

참고하세요 if bar in value 명령문** 끝에 이것은 다음을 알려주는 수정 절입니다. 목록 이해 조건을 충족하는 키-값 쌍만 유지합니다.** 이 경우 baz bar를 포함하는 foo의 사전만 포함하는 새 사전입니다(해당 코드 예제에서 아무것도 놓치지 않았으면 좋겠습니다...당신은 목록 이해 문서를 살펴봐야 할 수도 있습니다. docs.python.org 튜토리얼 그리고 에 secnetix.de, 나중에 질문이 있을 경우 두 사이트 모두 좋은 참고 자료가 됩니다.)

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top