2012-02-06 5 views
1

안녕하세요, 여러 변수로 중첩 목록을 정렬하는 방법을 알아 내려고하고 있습니다. 일부는 1,2,3으로 정렬되지 않고 미리 지정된 목록으로 정렬됩니다. 예중첩 목록을 객체 목록으로 정렬

:이 초래

List=[[XD,1],[XD,3],[XD,2],[X5,2],[X5,3],[XT,2]] 

:

[[XD,1],[XD,2],[XD,3],[XT,2],[X5,2],[X5,3]] 

첫번째 요소는 sortbylist 번호순 단순히 번째 요소에 의해 분류된다. 나는 현재의 코드를 사용하는 것을 시도하고있다

SortByList={'XD': 'A', 'XT':'B', 'XQ': 'C','X5': 'D'} 

:

List.sort(key=SortByList.__getitem__ x: x[0]) 
List=sorted(List,key=itemgetter(1)) 

그러나 이것은 작동하지 않습니다. 어떤 힌트? 이 작업을 수행하는 가장 쉬운 방법 중

하나는 :

Result=sorted(List, key=lambda x:(SortByList[x[0]],x[1])) 

답변

3

대해 어떻게 :

In [2]: List=[['XD',1],['XD',3],['XD',2],['X5',2],['X5',3],['XT',2]] 

In [3]: SortByList={'XD': 'A', 'XT':'B', 'XQ': 'C','X5': 'D'} 

In [4]: sorted(List, key=lambda x:(SortByList[x[0]],x[1])) 
Out[4]: [['XD', 1], ['XD', 2], ['XD', 3], ['XT', 2], ['X5', 2], ['X5', 3]] 

이 귀하의 질문에 설명 된대로, 2 요소의 복합 키를 사용합니다.

+0

이것은 파이썬에서 직접 실행할 때 완벽하게 작동합니다. 그러나 이것을 프로그램 내부에 배치하면 목록을 정렬하지 않는 것처럼 보입니다. 어떤 아이디어? – Daniel

+0

@Ophion :이 코드는 단순히 결과를 출력합니다. 'List'에 다시 할당하지 않습니다. 'List = sorted (List, key = ...)'로 변경하거나'List.sort (key = ...)'를 사용하십시오. – NPE

2

여기에서 문제는 정렬 순서를 얻기 위해 이름을 사용하여 개체를 정렬하려고하지만 개체의 이름이 무엇인지에 대한 참조가 없다는 것입니다. 당신의 객체 XD에서 또는 globals()으로 검색하는 것을 제외하고는 'XD'이라는 것을 알 수있는 방법이 없습니다.

여기서 가장 좋은 방법은 변수를 범위/네임 스페이스에 직접 저장하는 대신 사전에 저장하는 것입니다. List

XDict = {'XD': MyObject(...), 
     'X5': MyObject(...), 
     'XT': MyObject(...)} 
List = [[XDict['XD'],1],[XDict['XD'],3],[XDict['XD'],2], 
     [XDict['X5'],2],[XDict['X5'],3],[XDict['XT'],2]] 

내용은 정확히 동일합니다,하지만 지금은 이름 'XD', 'X5'를 연결하는 방법이 있고, 'XT'이에

XD = MyObject(...) 
X5 = MyObject(...) 
XT = MyObject(...) 
List=[[XD,1],[XD,3],[XD,2],[X5,2],[X5,3],[XT,2]] 

을 : 그래서에서 코드를 변경 객체를 가지고 있기 때문에 SortList을 정의 할 때 실제 객체의 목록을 그 이름으로 만들 수 있습니다 :

이 방법을 사용하면 XQ과 같은 일부 변수가 정의되지 않은 경우에도 SortByList을 만들 수 있습니다. SortByList의 항목은 None 일 뿐이므로 다른 요소가 정렬 될 때 문제가 발생하지 않습니다.

+0

나는 이것에 대한 간단한 대답이 있기를 바랬습니다. aix에 의한 제안이 작동하지 않는다면 이것을 사용할 것입니다. 의견을 보내 주셔서 감사합니다. – Daniel

관련 문제