2011-03-09 5 views
1

이것은 파이썬에서 오브젝트를 검색 한 방법입니다. 더 효율적인 (더 빠르고 간단한) 방법이 있습니까?오브젝트 검색

Obs : A는 알려진 개체입니다.

for i in Very_Long_List_Of_Names: 
    if A == My_Dictionary[i]: 
     print: "The object you are looking for is ", i 
     break 
+2

발견 키를 반환 그래서 그것은 긴 목록을 통해 반복하지 않습니다. 아마 당신은 "틈"을 한 단계 더 들여 쓰기를 의미할까요? –

+0

PEP8 : Very_Long_List_Of_Names, My_Dictionary. 응. – tokland

+0

역 사전 (값 -> 키)이 필요합니다. 빌드하기에 적합합니까? – tokland

답변

1

한 라이너는 다음과 같습니다 (i for i in List_of_names if A == My_dictionary[i]).next(). My_dictionary의 키와 항목이 발견되지 않는 경우 StopIteration하지 List_of_names의 항목이있는 경우에 이것은 KeyError을 던졌습니다

, 다른, 그것은 당신의 코드는 항상 중단됩니다 A.

+0

나는이 생성기 + 다음을 좋아하지만 내 응용 프로그램에서는 먼저()를 빌드하는 것을 선호하므로 더 의미가있다 : 먼저 (List_of_names if i == My_dictionary [i]) – tokland

0

당신이 파이썬 사전의 값으로 개체를 찾고 있다고 가정합니다.

단순히, 당신이 할 수있는 (에서와 같이, 당신이 정말로 것을 값으로 키지도 알고 걱정하지 않는다)의 존재를 확인하려는 경우 :

if A in My_Dictionary.values(): 
    print "The object is in the dictionary" 

을 그렇지 않으면, 당신이 원하는 경우

for k, v in My_Dictionary.iteritems(): 
    if v == A: 
     print "The object you are looking for is ", k 
     break 

편집 : 같은 사전에 같은 값으로 여러 키를 가질 수 참고 값과 연관된 키를 얻을 수 있습니다. 위의 코드는 첫 번째 발생 항목 만 찾습니다. 그래도 엄청난 이름 목록을 가지고있는 것이 확실합니다. :-)

0

특정 값을 찾는 모든 키를 검색하는 경우 사전을 잘못 사용하고있는 것처럼 보입니다.

A이 해시 가능이면 A를 값이 i 인 사전에 저장하십시오.

d = {A: 'a_name'} 

My_Dictionary 거대한하지 않고 메모리에 수 사소 적합하고, A이 해쉬이면, 그것에서 중복 사전을 만들 :

d = dict((value, key) for key, value in My_Dictionary.iteritems()) 
if A in d: 
    print "word you're looking for is: ", d[A] 

을 그렇지 않으면, 당신은 반복해야합니다 모든 키를 통해 :

for word, object_ in My_Dictionary.iteritems(): 
    if object_ == A: 
     print "word you're looking for is: ", word 
+0

"역순"키와 새 사전의 값은 중복 값이 ​​서로 겹쳐 쓰임을 의미합니다. 그러나 원래의 게시물에는 처음에 가치가있는 값 중 어느 것을 알지 못하는 문제가 있습니다. –

+0

당신 말이 맞습니다. 그러나 제 변호에서, relima가 자신의 for 루프를 쓰는 방법을 가정하면 그럴 것이라고 생각했습니다. –

관련 문제