복붙노트

[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. ==============================

    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. ==============================

    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. ==============================

    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. ==============================

    4.파티션의 결과가 튜플

    파티션의 결과가 튜플

    def getint(name):
        (basename, part, ext) = name.partition('.')
        (alpha, num) = basename.split('_')
        return int(num)
    
  5. ==============================

    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 대신 정렬 된 사용

  6. from https://stackoverflow.com/questions/4623446/how-do-you-sort-files-numerically by cc-by-sa and MIT license