2017-03-28 3 views
2

나는 사전 튜플 키와 정수 카운트를 구성하고 난 (키 [2]) 그래서파이썬 - 튜플 값에 의해 튜플 - 키 입력 사전 정렬

data = {(a, b, c, d): 1, (b, c, b, a): 4, (a, f, l, s): 3, (c, d, j, a): 7} 
print sorted(data.iteritems(), key = lambda x: data.keys()[2]) 
으로 튜플의 세 번째 값을 정렬 할 이 원하는 출력

>>> {(b, c, b, a): 4, (a, b, c, d): 1, (c, d, j, a): 7, (a, f, l, s): 3} 

하지만 내 현재 코드와

는 아무것도 할 것으로 보인다. 어떻게해야합니까?

편집 : 적절한 코드는

sorted(data.iteritems(), key = lambda x: x[0][2]) 

하지만 맥락에서

from collections import Ordered Dict 
data = {('a', 'b', 'c', 'd'): 1, ('b', 'c', 'b', 'a'): 4, ('a', 'f', 'l', 's'): 3, ('c', 'd', 'j', 'a'): 7} 
xxx = [] 
yyy = [] 
zzz = OrderedDict() 
for key, value in sorted(data.iteritems(), key = lambda x: x[0][2]): 
    x = key[2] 
    y = key[3] 
    xxx.append(x) 
    yyy.append(y) 
    zzz[x + y] = 1 
print xxx 
print yyy 
print zzz 

ZZZ는 정렬되지 않은 것입니다. 사전은 기본적으로 순서가 지정되지 않았고 OrderedDict를 사용하여 정렬해야하기 때문에 사전을 정렬 할 수 있지만 어디에서 사용해야할지 모르겠습니다. 체크 된 응답으로 사용하면 '범위를 벗어난 튜플 인덱스'오류가 발생합니다.

솔루션 :

from collections import OrderedDict 
data = {('a', 'b', 'c', 'd'): 1, ('b', 'c', 'b', 'a'): 4, ('a', 'f', 'l', 's'): 3, ('c', 'd', 'j', 'a'): 7} 
xxx = [] 
yyy = [] 
zzz = OrderedDict() 
for key, value in sorted(data.iteritems(), key = lambda x: x[0][2]): 
    x = key[2] 
    y = key[3] 
    xxx.append(x) 
    yyy.append(y) 
    zzz[x + y] = 1 
print xxx 
print yyy 
print zzz 
+2

사전은 정렬되지 않음 – depperm

+0

iteritems가 호출 될 때 사전을 정렬 할 수 있습니다. –

+0

@JonathanConnell : 그렇다고해서 원하는 출력을 얻을 수있는 것은 아닙니다. –

답변

3

사전 파이썬에서 순서가 있습니다. 그러나 OrderedDict을 사용할 수 있습니다. 당신은 그래서 key를 얻기 위해 요소 튜플 (key,val)이기 때문에 key=lambda x:x[0][2]를 사용해야하고

from collections import OrderedDict 

result = OrderedDict(sorted(data.iteritems(),key=lambda x:x[0][2]))

, 당신은 x[0]를 사용 : 같은

는 그런 다음 정렬 할 수 있습니다.

이 제공 :

>>> data = {('a', 'b', 'c', 'd'): 1, ('b', 'c', 'b', 'a'): 4, ('a', 'f', 'l', 's'): 3, ('c', 'd', 'j', 'a'): 7} 
>>> from collections import OrderedDict 
>>> result = OrderedDict(sorted(data.iteritems(),key=lambda x:x[0][2])) 
>>> result 
OrderedDict([(('b', 'c', 'b', 'a'), 4), (('a', 'b', 'c', 'd'), 1), (('c', 'd', 'j', 'a'), 7), (('a', 'f', 'l', 's'), 3)]) 

편집 : zzz을하기 위해

뿐만 아니라 주문, 당신은 당신의 코드를 업데이트 할 수 있습니다

data = {('a', 'b', 'c', 'd'): 1, ('b', 'c', 'b', 'a'): 4, ('a', 'f', 'l', 's'): 3, ('c', 'd', 'j', 'a'): 7} 
xxx = [] 
yyy = [] 
zzz = OrderedDict() 
for key, value in sorted(data.iteritems(), key = lambda x: x[0][2]): 
    x = key[2] 
    y = key[3] 
    xxx.append(x) 
    yyy.append(y) 
    zzz[x + y] = 1 
print xxx 
print yyy 
print zzz
+0

실제 문제는 정정했지만 설명하지 않은 분류 키입니다. –

+0

@MartijnPieters : 그래서 그들은 그들이 [편집]으로 무엇인가를 발명 한 것입니다. 먼저 op가 테스트 할 수있는 대답을 한 다음 설명하십시오. 대답이 기대를 충족시키지 못하면 시간 낭비가 적습니다 :).나는 당신이 실제로 거의 항상 똑같은 것을 느낀다 : –

+0

게시물의 [수정] (https://stackoverflow.com/posts/43070905/revisions)은'key = lambda x : data.keys() [2 ]'버전이 처음 5 분 안에있었습니다. –

3

키 기능이 완전히 부서진. 현재 값이 x으로 전달되었지만이를 무시하고 항상 키 목록에서 두 번째 항목을 가져옵니다.

대신 key=lambda x: x[0][2]을 사용하십시오.

+0

iteritems()가 (key, value) 튜플을 방출하기 때문에'x [0] [2]'를 사용해야한다고 생각합니다. –

+0

고마워, 당신 말이 맞아요. –