2017-10-11 1 views
1

에 의해 나는 같은 정의 사전이 있습니다파이썬 정렬 사전 절대 값

dict: {'KEY1': Decimal('-6.20000'), 'KEY2': Decimal('-2.58000'), 'KEY3': Decimal('6.80000')} 

을 나는 목록 또는 절대 값으로 정렬 된 키/값 쌍의 OrderedDict 하나를 갖고 싶어.

sorted_dict = sorted(mydict, key=lambda k: abs(mydict[k]), reverse=True) 

을하지만 그들은 절대 값으로 분류 것으로 보인다 않지만이 경우에만 해당 값없이 키의 목록을 반환

나는 시도했다.

어떻게 절대 값으로 분류 OrderedDict 또는 키와 값을 모두 포함하는 튜플의 목록 만받을 수 있나요?

+0

'분류 ((ABS (k는 sorted_dict = 분류 ((ABS (K) dict.items에서, V) k에 대한, V :), V) K를 들어, d.items()에서 V,'I 오류가 발생하는 한 가지 방법 –

+0

인가) = 진정한 반전(),^ SyntaxError : 유일한 인수가 아닌 경우 생성자 표현식을 괄호로 묶어야 함 –

+0

그리고 sorted_dict = sorted ((abs (k), v) for dict.items())로 변경하면, 무역 루프 오류 : (, TypeError ("abs() : 'str'")에 대한 잘못된 피연산자 유형, <0x000001466D7DCE08>의 추적 대상) –

답변

1

당신은 사전 .items()보기에서 (키, 값) 튜플을 수신하고 그 값의 절대 값을 반환하는 키 기능이 필요합니다. 예 :

from decimal import Decimal 
from collections import OrderedDict 

data = {'KEY1': Decimal('-6.20000'), 'KEY2': Decimal('-2.58000'), 'KEY3': Decimal('6.80000')} 
out = OrderedDict(sorted(data.items(), key=lambda t: abs(t[1]))) 
print(out) 

출력

OrderedDict([('KEY2', Decimal('-2.58000')), ('KEY1', Decimal('-6.20000')), ('KEY3', Decimal('6.80000'))]) 

그것은 우리가 키 기능을 위해 적절한 def 기능을 사용하면 읽기가 좀 더 쉽다 :

def keyfunc(t): 
    return abs(t[1]) 

out = OrderedDict(sorted(data.items(), key=keyfunc)) 
+0

완벽하게 작동합니다, 고마워요! 처음에 나는 OrderedDict 변환이 명령을 엉망으로 만든다고 생각했지만 이것은 간단하게 일식 디버거가 보여준 것입니다 - 키 이름으로 dict 항목을 재배 열합니다 ... 콘솔 출력에 인쇄하면 올바른 순서가 표시됩니다. –

+0

@VincentL 아! 예, 사전을 키로 표시 할 때 "유용하게"사전을 정렬하는 몇 가지 IDE가 있습니다. 하지만 당신은 (https://stackoverflow.com [** kwargs로의 OrderedDict 사용]을 살펴, 그들은'OrderedDict's ... –

+0

@VincentL는 관련 메모에 정렬 할 수있을만큼 똑똑 거라고 생각 것/questions/26748097/using-an-ordereddict-in-kwargs) –

1

는 올바른 방향으로 가고있는 것입니다. .items을 사용하고 생성 된 튜플 쌍을 OrderedDict 생성자로 전달합니다.

from collections import OrderedDict 

values = { 
    'KEY1': Decimal('-6.20000'), 
    'KEY2': Decimal('-2.58000'), 
    'KEY3': Decimal('6.80000') 
} 

sorted_pairs = sorted(values.items(), key=lambda k: abs(k[1]), reverse=True) 
ordered_dict = OrderedDict(sorted_pairs) 
+1

감사합니다. 이것은 PM 2Ring과 같은 대답입니다. 나는 그것이 같은 시간에 게시 된 것을 본다. 그래서 나는 당신이 그의 것을 아직 보지 않았다고 생각한다. 나는 이미 그의 대답을 받아 들였지만, 입력에 감사드립니다. –