2011-11-11 3 views
2

경우, 나는이 작업을 수행 할 수 :x는 값 ...이 DICT 파이썬

d = {1:2, 3:4} 
if 4 in d: 
    print 'Aha!' 

하지만 값이 아닌 키에서 읽고 싶어. 이것을하는 Pythonic 방법은 무엇입니까?

+1

귀하의 문제와 해결책을 다시 생각해 보시기 바랍니다. 일부'v'에 의한 검색이 필요할 경우,'k-> v' 매핑은 적절한 데이터 구조가 아닙니다. –

+0

나는 dict를 사용하고 있습니다. 왜냐하면 저는 문자열을 파싱하고 dict에있는 정규 표현식 중 임의의 것과 일치하는 값을 미리 결정된 값으로 대체하기 때문에 dict이 완벽하게 작동합니다. 내가 딕트의 영향을받은 값에 대해 나중의 연산을 생략 할 필요가있어서 내 질문이 생겼다. 그래서 어색한 플럽입니다. 내가 그들을 대체 한 후에 임시 목록에 넣는 것을 고려했지만, 나는 필요한 것보다 더 많은 변수를 갖고 싶지 않았다. :) –

+1

@ArturSapek, 당신의 dict이 당신의 요구에 완벽하게 부합합니까? 그것은 matching_regexp : replacement_string dict 인 경우, iteritems를 통해 반복해야하므로 매핑을 바꿀 수도 있습니다 (replacement_string : matching_regexp). 또한, py 2.7+ collections.OrderedDict를 사용하지 않는 한, 값은 어떤 순서로도 나오지 만 ... 대체 할 수있는 좋은 아이디어는 아닙니다. 또는 건너 뛸 값을 목록이 아닌 임시 세트에 저장하지 않는 것이 좋습니다. 그러면 코드의 가독성을 높이려면 'replacement_strings'이라고 할 수 있습니다. –

답변

5

사용 itervalues :이 잠재적 사전에 모든 값을 검사 필요하기 때문에 키 조회보다 훨씬 느릴 것

d = {1:2, 3:4} 
if 4 in d.itervalues(): 
    print 'Aha!' 

참고. 이 작업을 자주 수행해야하는 경우 값을 set에 저장하는 것이 좋습니다.

+0

내가 사용하고있는 사전에는 12 개가 넘는 쌍이 없어, 난장판 for-loop 해킹을 할 수 있었지만 나는 깨끗하고 싶었다. 고마워요, 저에게 완벽하게 작동하지만 미래에 대한 조언을 계속하겠습니다. –

3

사전의 특성상 키가 있는지 여부를 테스트 할 수있는 방법으로 값이 존재하는지 여부를 효율적으로 테스트 할 수 없다는 점이 있습니다.

마크가 제안하는 코드를 사용하여 투명하게 수행 할 수 있지만 사전을 반복하여 각 값을 테스트해야합니다. 사전 수가 많으면 성능이 문제가 될 수 있으며 다른 데이터 구조가 필요할 수 있습니다.

+0

세트가 좋아요 : http://docs.python.org/library/sets.html – kame