2012-09-05 5 views
0

가능한 중복 산출 튜플의 두 번째 키 찾기 :
Python dictionaries - find second character in a 2-character string which yields minimum value파이썬 사전 - 최소값을

내가 튜플 키의 첫 번째 항목을 제출하고 나머지 항목을 반환하고 싶습니다를 튜플 키 값을 최소화하는 키의 값. 예를 들어

: 나는 'a' 전달한다면

d = {('a','b'): 100, 
    ('a','c'): 200, 
    ('a','d'): 500} 

, 나는 'b'를 반환하고 싶습니다.

+3

이 작업을 효율적으로 수행하기 위해서는 완전히 잘못된 데이터 구조가 필요합니다. 무차별 공격이 필요합니다. –

+1

@MarkRansom : 가장 효율적인 방법은'get = { 'a': {100 : 'b', 200 : 'c', 500 : 'd'}}'get_min = 람다 d, k : d [k] [min (d [k])]. – Tadeck

답변

1

정렬은 여기 불필요 :

>>> d ={('a','b'):100,('a','c'):200,('a','d'):500,('b','c'):1000,('b','e'):100} 
>>> def func(d, k0): 
...  return min((k for k in d if k[0] == k0), key=d.get)[1] 
... 
>>> func(d, 'a') 
'b' 
>>> func(d, 'b') 
'e' 

이 표현식은 생성기 표현식을 사용하여 사전에 입력과 일치하는 키만 제공하고 관련 "가중치"(불행하게도 여기서는 "키"라고 함)로 사용됩니다. 사전. 사전에는 특정 키가 주어진 값을 반환하는 .get 메서드가 있으므로 사용하는 자연스러운 값입니다.

동점의 경우 임의의 키를 반환합니다.

+0

그냥 시간의 관점에서 호기심은 필터에 대한 목록 이해가 무엇입니까? –

+0

여기에는 listcomp가 없으며 genexp 만 있습니다. 성능에 관해서는'timeit'을 실행해야합니다. 나는 항상 잘못 생각합니다 ('filter'는 빠를 거 같아요,'lambda's는 C 레벨의 메소드보다 느려지니까요. 알고 있니?) – DSM

2
def func(d,y): 
    lis=sorted((x for x in d.items() if x[0][0]==y),key=lambda x:x[1]) 
    return lis[0][0][1] 


d ={('a','b'):100,('a','c'):200,('a','d'):500,('b','c'):1000,('b','e'):100} 

출력 :

>>> func(d,'a') 
'b' 
>>> func(d,'b') 
'e' 
+0

imho이게 내 대답보다 명확한 무엇입니까 +1 –

0
def minval(my_dict,var_name): 
     return min(filter(lambda x: x[0][0] == var_name,my_dict.items()),key=lambda x:x[1])[0][1] 

    print  minval(d,'a') 

내가 Ashwins의 대답은 복잡한 기준보다 더 파이썬 간단한에 의해 아마 더 좋은 생각, 심지어 자신의 수 있습니다 그들은 아마도 ... 시간 규모 simillarly 수행 빨리 ...