[PYTHON] 파일을 수치로 어떻게 정렬합니까?
PYTHON파일을 수치로 어떻게 정렬합니까?
우선, 내가 아래에있는 문제에 대한 해결책을 찾고있을 때 stackoverflow에서 찾을 수 없기 때문에 나는 이것을 게시하고있다. 그래서 여기 지식베이스에 조금 더 추가하고 싶습니다.
디렉토리의 일부 파일을 처리해야하고 파일을 숫자순으로 정렬해야합니다. wiki.python.org에서 람다 패턴을 사용하여 정렬과 관련된 몇 가지 예제를 발견했습니다.
#!env/python
import re
tiffFiles = """ayurveda_1.tif
ayurveda_11.tif
ayurveda_13.tif
ayurveda_2.tif
ayurveda_20.tif
ayurveda_22.tif""".split('\n')
numPattern = re.compile('_(\d{1,2})\.', re.IGNORECASE)
tiffFiles.sort(cmp, key=lambda tFile:
int(numPattern.search(tFile).group(1)))
print tiffFiles
나는 아직도 Python을 처음 접했을 뿐이므로 커뮤니티에서 코드 개선 (람다 제거), 성능, 스타일 / 가독성을 향상시킬 수 있는지 묻고 싶습니다.
고맙습니다, 재커리
해결법
-
==============================
1.이를 "자연 정렬"또는 "인간 정렬"이라고합니다 (기본값 인 사전 식 정렬과 반대). Ned B는 빠른 버전을 썼습니다.
이를 "자연 정렬"또는 "인간 정렬"이라고합니다 (기본값 인 사전 식 정렬과 반대). Ned B는 빠른 버전을 썼습니다.
import re def tryint(s): try: return int(s) except: return s def alphanum_key(s): """ Turn a string into a list of string and number chunks. "z23a" -> ["z", 23, "a"] """ return [ tryint(c) for c in re.split('([0-9]+)', s) ] def sort_nicely(l): """ Sort the given list in the way that humans expect. """ l.sort(key=alphanum_key)
그것은 당신이하고있는 것과 유사하지만 좀 더 일반화되어 있습니다.
-
==============================
2.그냥 사용 :
그냥 사용 :
tiffFiles.sort(key=lambda var:[int(x) if x.isdigit() else x for x in re.findall(r'[^0-9]|[0-9]+', var)])
try / except를 사용하는 것보다 빠릅니다.
-
==============================
3.sort 메소드에서 key =를 사용하고 있다면, 최신 버전의 Python에서 제거 된 cmp를 사용하면 안됩니다. 키는 레코드를 입력으로 사용하고 정렬 할 순서대로 비교할 개체를 반환하는 함수와 동일해야합니다. 람다 함수 일 필요는 없으며 독립 실행 형 함수로 더 명확 할 수 있습니다. 또한 정규식을 평가하는 속도가 느려질 수 있습니다.
sort 메소드에서 key =를 사용하고 있다면, 최신 버전의 Python에서 제거 된 cmp를 사용하면 안됩니다. 키는 레코드를 입력으로 사용하고 정렬 할 순서대로 비교할 개체를 반환하는 함수와 동일해야합니다. 람다 함수 일 필요는 없으며 독립 실행 형 함수로 더 명확 할 수 있습니다. 또한 정규식을 평가하는 속도가 느려질 수 있습니다.
다음과 같이 파일 이름의 정수 부분을 분리하여 반환 할 수 있습니다.
def getint(name): basename = name.partition('.') alpha, num = basename.split('_') return int(num) tiffiles.sort(key=getint)
-
==============================
4.파티션의 결과가 튜플
파티션의 결과가 튜플
def getint(name): (basename, part, ext) = name.partition('.') (alpha, num) = basename.split('_') return int(num)
-
==============================
5.이것은 @Don O'Donnell의 대답의 수정 된 버전입니다. 왜냐하면 나는 그걸 그대로 작동시키지 못했기 때문입니다. 그러나 잘 설명 된 것처럼 이것이 가장 좋은 대답이라고 생각합니다.
이것은 @Don O'Donnell의 대답의 수정 된 버전입니다. 왜냐하면 나는 그걸 그대로 작동시키지 못했기 때문입니다. 그러나 잘 설명 된 것처럼 이것이 가장 좋은 대답이라고 생각합니다.
def getint(name): _, num = name.split('_') num, _ = num.split('.') return int(num) print(sorted(tiffFiles, key=getint))
변경 사항 :
1) 알파 문자열은 필요하지 않으므로 저장되지 않습니다 (따라서 _, num).
2) num.split ( '.')을 사용하여 .tiff와 번호를 구분합니다.
3) https://docs.python.org/2/howto/sorting.html에 따라 list.sort 대신 정렬 된 사용
from https://stackoverflow.com/questions/4623446/how-do-you-sort-files-numerically by cc-by-sa and MIT license
'PYTHON' 카테고리의 다른 글
[PYTHON] 없음 값이있는 Pyspark 데이터 프레임 열 필터링 (0) | 2018.10.23 |
---|---|
[PYTHON] Python의 unittest 및 동적 테스트 케이스 생성 [duplicate] (0) | 2018.10.23 |
[PYTHON] 파이썬 - 파이프와 쉘 명령을 실행하는 방법? (0) | 2018.10.23 |
[PYTHON] threading.Thread.join ()의 사용 (0) | 2018.10.23 |
[PYTHON] Tensorflow : Tensorboard에서 사용자 정의 이미지를 표시하는 방법 (예 : Matplotlib Plots) (0) | 2018.10.23 |