2016-10-17 4 views
1

정렬 숫자를 넘어, 키 DICT 항목을 정렬 내 코드의 기본 매개 변수. 보시다시피, dict 키 문자열에있는 정수의 합은 항상 = n (이 경우 5, n = 5)입니다.이 코드를 작성했습니다

은 매 n 사람이 선택할 수 있습니다를 들어, DICT 이런 식으로 정렬되어 있음 (내 프로그램에서 더 어려운 목적을 위해) 나를 위해 중요하다

{'a0p(n)': 0, 'a1p(n-1)': 0, ....., 'a(n-1)p1': 0, 'a(n)p0': 0} 

내 코드 만에, 괜찮습니다 (N = 12) dizN : n 여기서 n은> = 10, 이런 것입니다 < 10 경우

Out[121]: 
    {'a0p12': 0, 
    'a10p2': 0, 
    'a11p1': 0, 
    'a12p0': 0, 
    'a1p11': 0, 
    'a2p10': 0, 
    'a3p9': 0, 
    'a4p8': 0, 
    'a5p7': 0, 
    'a6p6': 0, 
    'a7p5': 0, 
    'a8p4': 0, 
    'a9p3': 0} 

인터프리터는 숫자 정렬을 다음에서 볼 수 있듯이,

{'a0p12': 0, 
'a1p11': 0, 
'a2p10': 0, 
'a3p9': 0, 
'a4p8': 0, 
'a5p7': 0, 
'a6p6': 0, 
'a7p5': 0, 
'a8p4': 0, 
'a9p3': 0, 
'a10p2': 0, 
'a11p1': 0, 
'a12p0': 0} 

하십시오 같은 DICT를 얻는 방법으로 분류되어이 방법이 있는지

아무도 알아?

나는 사전은 기본적으로 비 정렬 것을 알고,하지만 난 누군가가 어쨌든 내 삶의 목적을 얻기 위해 :)

덕분에 많은 몇 가지 트릭을 알고 희망!

+0

당신은 사전 주문에 대한 여러 번 쓸 수 있지만 파이썬의 사전 주문할 수 없습니다. 아마도 당신은'OrderedDict'를 봐야 할 것입니다. –

+0

사전의 전체적인 부분은 주문되지 않았다는 것입니다. 해시 테이블입니다. – Daniel

+0

내가 따르고 자하는 정렬 기준은 dict 키 문자열의 첫 번째 정수에 의해 "간단히"(문자열이 아닌) 정수로 간주됩니다. 또는 더 나은 설명을 위해, 내 dict의 키인 문자열에서 문자 'a'를 따르는 정수 : 'a (정수) p (정수)'. –

답변

1

dicts 그래서 당신은 항목을 정렬하고 정렬 된 순서를 유지하기 위해 OrderedDict를 사용하도록해야 할 것 순서를 얻기 위해, 정렬되지 않은 있습니다.

from itertools import groupby 
from collections import OrderedDict 
d = {'a0p12': 0, 'a10p2': 0, 'a11p1': 0, 'a12p0': 0, 'a1p11': 0, 'a2p10': 0, 
    'a3p9': 0, 'a4p8': 0, 'a5p7': 0, 'a6p6': 0, 'a7p5': 0, 'a8p4': 0, 'a9p3': 0} 

def key_func(x): 
    """'a0p12' -> (0, 12)""" 
    return tuple(int("".join(v)) for k,v in groupby(x[0], key=str.isdigit) if k) 
od = OrderedDict(sorted(d.items(), key=key_func)) 

print(od) 

당신을 줄 것이다 :

OrderedDict([('a0p12', 0), ('a1p11', 0), ('a2p10', 0), ('a3p9', 0), 
('a4p8', 0), ('a5p7', 0), ('a6p6', 0), ('a7p5', 0), ('a8p4', 0), 
('a9p3', 0), ('a10p2', 0), ('a11p1', 0), ('a12p0', 0)]) 

당신은 또한 정규식을 사용할 수 있습니다 당신은 당신이 일종의 사전 식 순서로 정수로 당신 때문에 정수의 그룹의 튜플을 만들 수 있습니다 원하는 순서를 얻으려면는 숫자의 그룹을 찾을 수 있습니다 :

from collections import OrderedDict 
import re 

d = {'a0p12': 0, 'a10p2': 0, 'a11p1': 0, 'a12p0': 0, 'a1p11': 0, 'a2p10': 0, 
    'a3p9': 0, 'a4p8': 0, 'a5p7': 0, 'a6p6': 0, 'a7p5': 0, 'a8p4': 0, 'a9p3': 0} 



def key_func(x,patt=re.compile("\d+")): 
    """'a0p12' -> (0, 12)""" 
    return tuple(map(int, patt.findall(x[0]))) 

od = OrderedDict(sorted(d.items(), key=key_func)) 

print(od) 
+0

많은 Padraic에게 감사드립니다! 내 프로그램에서이 멋진 솔루션을 시도해 볼 것이고, 그런 다음이 이상한 분류가 필요한 가장 큰 문제에 대해 다른 질문을 할 것입니다. :) –

+0

글자가 항상 똑같고 순서가 같지 않습니까? 아니면 걱정할 필요가 없습니까? –

+1

글자에 문제가 없습니다. dict 키 양식은 항상 다음과 같습니다. –

관련 문제