2012-06-22 5 views
4

불행히도 이름으로 정렬해야하는 파일이 있습니다. 문자열에서 숫자를 정렬하기 때문에 일반 정렬을 사용할 수 없기 때문에 일부 조사를 수행하고 찾고있는 사람은 natural sorting입니다.파이썬 자연 정렬

나는 here 주어진 솔루션을 시도하고 완벽하게 작동했습니다.

그러나, 그것은 단지이 경우 11 될 첫 번째 정수를 일치하기 때문에 특정 자연 키 알고리즘은 실패하고, 그래서 정렬을 던졌습니다 원인 PresserInc-1_10.jpgPresserInc-1_11.jpg 같은 문자열. 그래서 도움이 될 것 같아요 문자열에있는 모든 숫자를 일치시키고 그들을 함께 그룹화, 그래서 만약 내가 PresserInc-1_11.jpg 알고리즘을 다시 111 내 질문을 제공해야합니다,이 가능합니까?

files = ['PresserInc-1.jpg', 'PresserInc-1_10.jpg', 'PresserInc-1_11.jpg', 'PresserInc-10.jpg', 'PresserInc-2.jpg', 'PresserInc-3.jpg', 'PresserInc-4.jpg', 'PresserInc-5.jpg', 'PresserInc-6.jpg', 'PresserInc-11.jpg']

+1

내가 질문을하지 않습니다 ... 더 명확 입력 및 게시하시기 바랍니다 예상 출력 –

답변

8

Google: Python natural sorting :

여기에 파일 이름의 목록입니다.

Result 1 : 내가 링크 한 페이지입니다.

그러나 거기서 멈추지 마십시오!

Result 2 : 제대로 수행하는 방법을 설명하는 Jeff Atwood의 블로그.

Result 3 : 제프 앳 우드의 블로그를 기반으로 한 답변입니다. 데이터에 대한

import re 

def natural_sort(l): 
    convert = lambda text: int(text) if text.isdigit() else text.lower() 
    alphanum_key = lambda key: [convert(c) for c in re.split('([0-9]+)', key)] 
    return sorted(l, key=alphanum_key) 

결과 :

여기 그 대답에서 코드의

 
PresserInc-1.jpg 
PresserInc-1_10.jpg 
PresserInc-1_11.jpg 
PresserInc-2.jpg 
PresserInc-3.jpg 
etc... 

온라인으로 작업을 참조하십시오 ideone

+1

'키 =하시기 바랍니다 alphanum_key' –

+0

덕분에 공백, 당신은 : 바로 거기 중지 안있어, 조금 피곤 .. 감사합니다 :) – Paulo

2

당신은 타사 라이브러리를 괜찮다면, 이를 달성하기 위해 natsort을 사용할 수 있습니다.

>>> import natsort 
>>> files = ['PresserInc-1.jpg', 'PresserInc-1_10.jpg', 'PresserInc-1_11.jpg', 'PresserInc-10.jpg', 'PresserInc-2.jpg', 'PresserInc-3.jpg', 'PresserInc-4.jpg', 'PresserInc-5.jpg', 'PresserInc-6.jpg', 'PresserInc-11.jpg'] 
>>> natsort.natsorted(files) 
['PresserInc-1.jpg', 
'PresserInc-1_10.jpg', 
'PresserInc-1_11.jpg', 
'PresserInc-2.jpg', 
'PresserInc-3.jpg', 
'PresserInc-4.jpg', 
'PresserInc-5.jpg', 
'PresserInc-6.jpg', 
'PresserInc-10.jpg', 
'PresserInc-11.jpg'] 
관련 문제