2016-06-04 3 views
2

defaultdict(dict) 키가 모두 문자열이고 그 값이 float 인 경우, 전체 defaultdict에서 값의 내림차순을 기준으로 k 키를 찾는 방법은 무엇입니까?defaultdict에서 가장 높은 값을 갖는 키 쌍을 찾습니다.

2 개 루프를 작성하고 100 쌍의 목록을 저장하고 기존 값보다 많은 항목이 n^2 번 발견되면 목록을 새 항목으로 바꿀 수 있습니다. 그러나 파이썬에서이 작업을 수행하는 적절한 방법이 있습니까?

샘플 파일

defaultdict(<type 'dict'>, {u'just': {u'don': 24.163775416342308, u'like': 28.68171888897304, u'make': 21.69210433035232},'like':{'just':28.68171888897304,'don':12.34, 'mike':27.675}} 

원하는 출력, 당신이 가장 크고 smallests 값을 추출하고 때마다

just,like, 28.68171 
like,mike, 27.675 
just,don, 24.16377 
+0

주어진 예제에 대해 원하는 출력을 게시 할 수 있습니까? – MaxU

+0

@MaxU - 지금 확인해주세요. –

답변

2

heapq.nlargestheapq.nsmallest (나는 전체 컬렉션에서 3 평가 항목을 가기 만하면 가정) 함수는 가장 친한 친구입니다.

>>> from heapq import nlargest 
>>> from operator import itemgetter 
>>> from pprint import pprint 

>>> d = defaultdict(dict, 
      {'just': {'don': 24.163775416342308, 
        'like': 28.68171888897304, 
        'make': 21.69210433035232}, 
      'like': {'don': 12.34, 
        'just': 28.68171888897304, 
        'mike': 27.675}}) 

>>> flattened = ((outerkey, innerkey, value) for outerkey, innerdict in d.items() 
       for innerkey, value in innerdict.items()) 
>>> result = nlargest(3, flattened, key=itemgetter(2)) 

>>> pprint(result) 
[('just', 'like', 28.68171888897304), 
('like', 'just', 28.68171888897304), 
('like', 'mike', 27.675)] 

파이썬 2에서는 items() 대신 iteritems()을 사용하는 것이 더 효율적입니다.

관련 문제