2009-06-26 5 views
0

에 기초 튜플들의 집합에서 튜플 가져 :이 같은 튜플들의 집합 인 데이터 구조를 가지고 함유 값

things = ((123, 1, "Floogle"), (154, 33, "Blurgle"), (156, 55, "Blarg")) 

첫 번째와 세 번째 요소 컬렉션에 각각 고유있다.

>>> my_thing = things.get(value(3) == "Blurgle") 
(154, 33, "Blurgle") 

각 값을 하나 하나 확인하는 루프를 작성하는 것보다 더 나은 방법이 있어야합니다 : 내가 예를 들어, 세 번째 값을 참조하여 특정 튜플을 검색되고 싶지

!

+0

나중에 검색하기 쉽고 빨라집니다 데이터 세트가 작기 때문에 convert-to-dict 응답을 통해 대답하고 다른 요소 중 하나를 기반으로 튜플을 검색하려고 할 수도 있습니다. – ManicDee

+0

주목할 것은 (일반적으로) "목록 이해"가 아니라 "루프 이해"라는 것입니다. Nitpick? Google에서 얻은 결과 나 좋은 결과가 마음에 들지 않으면 질식하는 것입니다. –

답변

1

things이 목록이고 세 번째 요소가 uniqe 인 경우, 목록 이해는 어떻게됩니까?

>> my_thing = [x for x in things if x[2]=="Blurgle"][0] 

하지만 모든 값을 검토하여 개별적으로 확인한다고 가정합니다. 만약 당신이 그것을 좋아하지 않는다면, dict이되도록 my_things 구조를 변경하고 첫 번째 또는 세 번째 값을 키로 사용하는 것은 어떨까요?

+0

일반적인 경우 루프 반복은이 문제를 해결하는 가장 쉬운 방법입니다.의견을 보내 주셔서 감사합니다. – ManicDee

+1

발전기 이해력을 사용하는 경우 전체 목록을 반복하지 않아도됩니다. "my_thing = (x는 x [2] =="Blurgle "인 경우 x에 대해 x) next()"- 항목이 녹이다. – Brian

+0

당신이 맞다. Brian, 2.6과 그 다음 버전 (x [2] == 'zap'이라면 x를위한 x를위한 것)은 2.4 호환의 아이디어보다 낫다. –

4

외부 수준 구조가 튜플 인 경우 루프 (또는 목록 이해 또는 genexp와 같은 100 % 동일)가 실제로는 유일한 방법입니다. 즉, 튜플은 고의적 디자인으로 매우 밝은 색 (거의 인덱싱, 루핑 등을 구현하는 데 필요한 몇 가지 특수 메서드 ;-).

번개 빠른 검색은 튜플이 아닌 사전의 특징입니다. 당신이 찾은 subtuple (또는 주요 튜플의 인덱스)에 "세 번째 요소의 값"을 매핑하는 사전 (기본 구조 또는 보조 보조 노드)을 가질 수 있습니까? 그것은 단일 루프로 구축 된 다음 원하는만큼 빠른 검색을 제공 할 수 있습니다! 당신은 루프를 선택하면

, 브라이언의 의견이에 대한 내 대답에 따라 같은 genexp는 listcomp보다 어쩌면 배 빠른 모두 더 읽기 평균에 (그것은 단지 절반 루프처럼) :

my_thing = next(item for item in things if item[2] == "Blurgle") 

"[2] 하위 항목 equale Blurgle"의 다음 항목으로 부드럽게 읽습니다. (처음부터 "다음"항목이 "처음"이 될 것입니다. 케이스, 전용 - 적합한 것).

항목이 술어를 충족시키지 않는 경우를 처리해야하는 경우 next을 전달할 수 있습니다 (필요한 경우 반환 함). 그렇지 않으면 (내 발췌 문장 에서처럼 두 번째 인수없이) 어떤 항목도 술어를 만 족시키지 않으면 StopIteration 예외를 얻습니다. 원하는 동작이 될 수 있습니다. (문제가 발생해서는 안되며 예외는 예기치 않은 오류 일 수 있으므로 특정 응용 프로그램에 적합하게 보입니다). 당신이 한 번 things_dict하기 위해, 당신은 왜 일을 변환하지 않는 검색 여러 번 이런 종류의 작업을 수행해야하는 경우 나 루프의 이해를 선택

+0

결과를 빨리 얻는 것보다 명확하게 의도를 표현하는 데 더 많은 관심이 있습니다. 파이썬의 루프 이해력을 사용하면 유지 보수 프로그래머의 좌절을 희생시키면서 코드 간결함을 실현하는 한 줄의 코드로 루프를 줄일 수 있습니다. (C 및 Perl의 3 진 '?'와 같이) 사전 아이디어는 관점에서 의미가 있습니다 하나의 파라미터에 기초하여 정보를 신속하게 검색 할 수있다. 감사의 말씀 감사합니다. – ManicDee

+0

이 질문을 가리 키도록 코드를 업데이트했습니다. 내 일을 맡기 위해 훈련하는 사람이 내 문제가 아니라 파이썬만큼 배울 수 없다. #passiveaggressive – ManicDee

+0

그리고 2 년 후 이것을 다시 생각해 보면, 발전기 이해력은 이제 실제로 더 읽기 쉽게 보입니다. 하지만 필자는 파이썬 1 ~ 2 년의 장점을 지니고 있으며, 이전의 코멘트로 이어지는 좌절과 분노로 더 이상 깜박하지 않습니다. 명확한 설명에 감사드립니다! – ManicDee

1

은,

things = ((123, 1, "Floogle"), (154, 33, "Blurgle"), (156, 55, "Blarg")) 

things_dict = {} 
for t in things: 
    things_dict[t[2]] = t 

print things_dict['Blarg'] 
+0

dict로 변환하면 값을 두 번 이상 검색해야하는 경우 확실히 문제가 해결됩니다. 고맙습니다! – ManicDee