2012-10-15 3 views
3

의 길이를 기준으로 정렬이 :파이썬 : OrderedDictionary는이 같은 객체가 키 값

t = {'rand_key_1': ['x'], 'rand_key_2': [13,23], 'rand_key_3': [(1)], 'rk5': [1,100,3,4,3,3]} 

변화와 ALL은 값으로 목록을 무작위 키 (문자열 및/또는 INT)와 사전 크기.

이 사전을 사전 항목 목록의 길이에 따라 정렬 된 OrderedDict로 바꾸고 싶습니다. 나는이 시도

두 개 이상의 항목이 같은 값이있는 경우

t_ordered = {'rk5': ..., 'rand_key_2': .., 'rand_key_1': .., 'rand_key_3': ..} 

(그들의 순서는별로 중요하지 않습니다하지만 난 실패하고있다 :. 그래서 주문 후 나는 싶어

OrderedDict(sorted(d, key=lambda t: len(t[1]))) 
제가하려고하는 것은 바보 같은 동네 짱 경우

나는 경험이 너무 실례 있지 않다.

을 내가 할 수있는 무엇?

고마워요.

답변

5

당신은 실제로 당신이 sorted에게 건네 준 정렬 기능과 아주 가깝습니다. 주목할 점은 사전에 정렬 된 것은 사전의 interable을 반환합니다. 우리가 인덱스 각 키를 사용하여 사전을 함수를 수정한다면 :

>>> sorted(t, key=lambda k: len(t[k])) 
['rand_key_3', 'rand_key_1', 'rand_key_2', 'rk5'] 
는 또한 키가 역순으로 반환되도록 지정할 수 있습니다

이 키 바로 위에 반복 : 보통

>>> for sorted_key in sorted(t, key=lambda k: len(t[k]), reverse=True): 
...  print sorted_key, t[sorted_key] 

rk5 [1, 100, 3, 4, 3, 3] 
rand_key_2 [13, 23] 
rand_key_3 [1] 
rand_key_1 ['x'] 

당신 같으면 최신 사전 데이터를 사용하여 새 정렬 된 목록을 반복하는 것처럼 OrderedDict를 만들어야합니다.

+0

감사합니다.나는 최고의 대답 중 하나 여야합니다. '나는 항상 듣고있다. 좋은 설명. 나는 그것을 정말로 얻는다, 나는 생각한다. 고마워요! – Phil

3

이 할 수 있도록 주문 사전, 그 삽입 순서를 기억 때문에 : 먼저 정렬 한 후 OrderedDict() 사용하여 간단한 사전을 사용

OrderedDict(sorted(d.items(), key=lambda t: len(t[0]))) 
+1

키 값의 길이에 따라 정렬하려면 t [1]을 원한다고 생각합니다. 이 키의 길이에 따라 정렬됩니다. – schodge

5

을 : 파이썬에서

>>> from collections import OrderedDict as od 
>>> k=sorted(t, key=lambda x:len(t[x]), reverse=True) 
>>> k 
['rk5', 'rand_key_2', 'rand_key_3', 'rand_key_1'] 

>>> od((x, t[x]) for x in k) 
OrderedDict([('rk5', [1, 100, 3, 4, 3, 3]), ('rand_key_2', [13, 23]), ('rand_key_3', [1]), ('rand_key_1', ['x'])]) 
+0

안녕하세요 Ashwini. 도와 줘서 고마워. 이것은 정확히 내가 원하는 것은 아니지만 불가능하기 때문에 (내 마음에서 바라는 것), 나는 당신의 첫 번째 해결 방법을 따라 순서대로 반복하고 사전에서 인쇄하는 키처럼 사용할 것이다. – Phil

1

OrderedDict이 모음입니다 항목이 삽입 된 순서를 기억합니다. 이 문맥에서 주문한 것은 소트 된 것을 의미하지 않는다.

당신이 필요로하는 모든이 정렬 된 순서에있는 모든 항목을 얻을 경우이 같은 수행 할 수 있습니다 그러나

for key, value in sorted(t, key = lambda x: -len(x[0])): 
    # do something with key and value 

, 당신은 여전히 ​​정렬되지 않은 데이터 구조를 사용하는 - 단지 정렬 된 순서대로 반복합니다. 이것은 여전히 ​​k 번째 요소를 찾는 작업이나 dict의 요소의 후속 작업이나 이전 작업을 지원하는 작업을 지원하지 않습니다.