2014-12-14 4 views
3

저는 파이썬 2.7.6을 사용하고 있습니다. 을 사용하여 json 객체를 정렬하는 데 문제가 있습니다 (사전 목록 형태로).Python 정렬 방법은 두 자리 문자열을 세 자리 문자열로 처리합니다.

처음 정렬 된 출력을 검사했을 때 중간에 작은 숫자가 있기 때문에 목록이 부분적으로 만 정렬 된 것 같습니다. 면밀한 조사에서 93과 같은 두 자리 숫자가 93X처럼 취급되고있는 것처럼 보입니다. 이 통찰력으로 정렬 된 결과가 올바른 것으로 나타났습니다.

왜 이런 일이 발생하는지 알 수 없습니다. 처음에는 json 객체를 정렬하기 전에 파이썬 객체로 제대로 변환하지 않았기 때문에 그것이 가능할 것이라고 생각했습니다. 그러나이 코드는 인 json.load이 json 객체를 비동기 객체로 비 직렬화 할 것이므로이 문제는 아닌지 의심 스럽습니다.

Here's the jsbin "정렬 된"출력 정렬 된 목록을 다시 정렬하려고 시도했지만 정확한 결과를 얻을 수 있습니다. 아래

코드 : 당신은 지금 AveragePoints 값이 수레로 비교됩니다이

sorted(data, key = lambda item : float(item["AveragePoints"]), reverse = True) 

같은 정렬하기 전에 숫자로 AveragePoints을 변환 할 필요가

import json 

json_data = open('test.json') 
data = json.load(json_data) 

results = sorted(data, key = lambda item : item["AveragePoints"], reverse = True) 

with open('output.json', 'w') as outfile: 
    json.dump(results, outfile); 

json_data.close() 
+1

아마도 : key = lambda item : float (item [ "AveragePoints"])'? –

+1

문자열은 사전 식으로 정렬되므로 "천문학적"이 "큰"것과 같은 방식으로 "100"이 "2"보다 작습니다. – tdelaney

+1

이 문제는 json이 올바르지 않기 때문에 발생합니다. 정수는''AveragePoints ': 999''가 아니라''AveragePoints ": 999'로 인코딩되어야합니다. 이 문제를 해결하면 코드가 잘 작동합니다! ('float'도 효과가 있지만 증상이 아닌 원인을 치료하는 것이 항상 더 좋습니다.) – georg

답변

3

정렬이되도록 적절하게.

참고 : AveragePoints은 항상 정수가 될 것이라고 확신하는 경우, 대신 floatint 기능을 사용할 수 있습니다.

+0

감사합니다 [thefourtheye] (http://stackoverflow.com/users/1903116/thefourtheye), 그. 나는 [python docs] (https://wiki.python.org/moin/HowTo/Sorting)가 문자열을 정렬 할 수있는 몇 가지 예제를 가지고 있었기 때문에 처음에는 변환하지 않았고, 문자열 번호에서도 잘 작동한다고 추측했다. –

+1

@YanYi이'print (sorted ([ "1", "10", "01"]))'를 시도하십시오. 너는 그것을 더 잘 이해할 것이다. – thefourtheye

관련 문제