2015-02-02 2 views
0

튜플 목록이 있습니다. 각 튜플은 다른 튜플과 인덱스로 구성됩니다. 필자는 내부 튜플 값의 차이에 따라 목록을 정렬하려고합니다. 다른 표기법 또는는 :복잡한 데이터 구조 정렬

[((float, float), int), ...] 

두 수레 내가 정렬 키에 사용할 것입니다.

나는이 쓴 :

from math import fabs 

def sort_for_avg(probabilities): # 'probabilites' is a list of float-pairs 
    return sorted(zip(probabilites, range(len(probabilites))), 
        key=lambda entry: fabs(entry[0][0]-entry[0][1])) 

내가 itemgetter 작업을 시도,하지만 난 그냥 간단한 검색과 정렬되지 않은 무언가를 위해 그것의 묘리를 터득하지 않았다. '분류 된'목록은 겉보기에 무작위로 그 곳곳에 있습니다.

확률 테이블이 상당히 커질 수 있으므로 필자는 솔루션에 값을 복사하지 않기를 원했기 때문에 이것이 매우 복잡한 한 줄짜리 이유입니다. 누군가가 발전기로 몇 줄에서 같은 작업을 수행하는 방법을 알고 있다면 나는 행복 할 것이다.

+0

당신은 몇 가지 입력과 예상 및 실제 출력을 제공 할 수 있을까요? http://stackoverflow.com/help/mcve에서 살펴보십시오. * "다른 표기법"*이 * Python * 인 경우 유용합니다. '[((float, float), int), ...]' – jonrsharpe

+0

재생할 수 없습니다. 오타를 수정 한 후, 이것은 정상적으로 작동하는 것 같습니다. 문제가 다른 곳에있을 수 있습니까? 테스트 데이터를 제공 할 수 있습니까? 결과가 무작위로 정렬되었거나 정렬되지 않았습니까? 즉, 여전히 색인 행이 정렬 되었습니까? 이 경우 결과를 변수에 다시 지정하는 것을 잊었을 수 있습니다. –

답변

3

예 데이터 :

probabilities = [((1.0,2.0),3),((3.0,1.0),1),((0.5,1.0),2)] 

자리에 정렬 :

probabilities.sort(key=lambda x: abs(x[0][0]-x[0][1])) 

출력 :

>>> probabilities 
[((0.5, 1.0), 2), ((1.0, 2.0), 3), ((3.0, 1.0), 1)] 

또는 새로운 정렬 된 목록으로 돌아 가기 :

sorted_probabilities = sorted(probabilities, key=lambda x: abs(x[0][0]-x[0][1])) 
,536,913,632을 10

는 출력 :

>>> sorted_probabilities 
[((0.5, 1.0), 2), ((1.0, 2.0), 3), ((3.0, 1.0), 1)] 
+0

고마워요, 이것은 멋지게 마무리되었습니다. 예상대로 작동합니다. – Arne