2016-10-26 2 views
-2

내가 지난 주에 요청하는 것과 유사한 질문이 있습니다 : "Sorting dict items by key, beyond alphanumeric sorting", 임시 기능

문제는 같은 글의,하지만 지금 내 딕셔너리의 키는 단순히 정수 :

>>>lis_nodiz = list(nodiz.items()) #list of dict items as tuples 
[(2, 316), 
(3, 66), 
(4, 37), 
(5, 15), 
(6, 10), 
(7, 4), 
(8, 3), 
(9, 1), 
(10, 2), 
(11, 1), 
(12, 1), 
(45, 1), 
(109, 1), 
(16, 1), 
(126, 1)] 

당신은 내가 튜플의 정렬 된 목록 찾고 있어요 추측 것 같이 나는 "key_func"Padraic Cunn를 재사용하는 것을 시도했다

[(2, 316), 
(3, 66), 
(4, 37), 
(5, 15), 
(6, 10), 
(7, 4), 
(8, 3), 
(9, 1), 
(10, 2), 
(11, 1), 
(12, 1), 
(16, 1), 
(45, 1), 
(109, 1), 
(126, 1)] 

을 잉햄 불행하게도이 기능은 문자열 형식의 DICT 키와 함께 작동하는 것 같다, 저를 제안 :

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

>>>lis_nodiz_od = sorted(nodiz.items(), key=key_func) 
TypeError: expected string or buffer 

가 어떻게 기능을 수정, 또는 나는 나의 목적을 얻을 수있는 또 다른 방법으로 할 수 있습니까? 누군가가 "key_func"가 실제로 어떻게 작동하는지, 그리고 정수로 작동하게하기 위해 올바른 수정을했는지를 설명해 주시면 감사하겠습니다. 이 방법을 통해 파이썬 프로그래밍에 대해 더 많이 이해할 수있을 것이고, 오늘의 내 문제를 해결할뿐만 아니라! 대단히 감사합니다!

+0

전에; 어쨌든 key_func에 관한 질문의 일부는 원래이며 이전에 묻지 않은 것 같습니다. 그래서 결정적인 내 질문에 완전히 물어 보지 않고 대답하기 전에 .. 당신까지! –

답변

2

전화 sorted() 또는 list.sort() 같은 : lis_nodiz 질문에서 언급 한 바와 같이 튜플의 목록입니다

# sorted(): Creates new list with sorted order 
>>> sorted(lis_nodiz) 
[(2, 316), (3, 66), (4, 37), (5, 15), (6, 10), (7, 4), (8, 3), (9, 1), (10, 2), (11, 1), (12, 1), (16, 1), (45, 1), (109, 1), (126, 1)] 

# list.sort(): sort the existing list 
>>> lis_nodiz.sort() 
>>> lis_nodiz 
[(2, 316), (3, 66), (4, 37), (5, 15), (6, 10), (7, 4), (8, 3), (9, 1), (10, 2), (11, 1), (12, 1), (16, 1), (45, 1), (109, 1), (126, 1)] 

.

참고 : 여기에 key을 지정할 필요가 없습니다. 기본적으로 0 번째 색인에서 사전 순 정렬을 수행합니다. 동일한 값의 경우 첫 번째 인덱스를 정렬합니다.

+2

두 번째 요소에서 정렬을 안정화하려는 경우에만 key 함수가 필요합니다. 튜플은 이미 왼쪽에서 오른쪽으로 요소를 사전 식으로 분류합니다. 또한,'operator.itemgetter (0)'는 사용자 정의 함수보다 더 효율적이어야합니다. – chepner

+0

@chepner : 귀중한 정보를 보내 주셔서 감사합니다. –

+1

좋아, 설문 조사와 답변에 감사드립니다. –

0

첫 번째 키에 람다로 정렬 할 필요가 없습니다. 튜플의 기본값입니다.

>>> sorted(x) 
[(2, 316), (3, 66), (4, 37), (5, 15), (6, 10), (7, 4), (8, 3), (9, 1), (10, 2), (11, 1), (12, 1), (16, 1), (45, 1), (109, 1), (126, 1)] 

이 자동으로 정렬 첫 번째 구성원에, 그들은 제 2 부재를 기준으로 정렬됩니다 동일한 경우는이 질문의 유지, 나는 질문 요청했다 알고에 대한 방어로 등