복붙노트

[PYTHON] 문자열이 목록의 문자열 중 하나로 끝나는 지 확인하십시오.

PYTHON

문자열이 목록의 문자열 중 하나로 끝나는 지 확인하십시오.

다음 코드를 작성하는 비범 한 방법은 무엇입니까?

extensions = ['.mp3','.avi']
file_name = 'test.mp3'

for extension in extensions:
    if file_name.endswith(extension):
        #do stuff

나는 for 루프의 명시 적 선언을 피할 수 있고 if 조건으로 작성한다는 막연한 기억이있다. 사실입니까?

해결법

  1. ==============================

    1.널리 알려지지는 않았지만 str.endswith도 튜플을 허용합니다. 반복 할 필요가 없습니다.

    널리 알려지지는 않았지만 str.endswith도 튜플을 허용합니다. 반복 할 필요가 없습니다.

    >>> 'test.mp3'.endswith(('.mp3', '.avi'))
    True
    
  2. ==============================

    2.그냥 사용 :

    그냥 사용 :

    if file_name.endswith(tuple(extensions)):
    
  3. ==============================

    3.파일에서 확장자를 가져 와서 확장자 세트에 있는지 확인하십시오.

    파일에서 확장자를 가져 와서 확장자 세트에 있는지 확인하십시오.

    >>> import os
    >>> extensions = set(['.mp3','.avi'])
    >>> file_name = 'test.mp3'
    >>> extension = os.path.splitext(file_name)[1]
    >>> extension in extensions
    True
    

    집합에서 조회를위한 시간 복잡성이 O (1) (docs)이기 때문에 집합을 사용합니다.

  4. ==============================

    4.정규 표현식과 문자열 (str) 메소드의 두 가지 방법이 있습니다.

    정규 표현식과 문자열 (str) 메소드의 두 가지 방법이 있습니다.

    문자열 메서드는 일반적으로 더 빠릅니다 (~ 2x).

    import re, timeit
    p = re.compile('.*(.mp3|.avi)$', re.IGNORECASE)
    file_name = 'test.mp3'
    print(bool(t.match(file_name))
    %timeit bool(t.match(file_name)
    

    루프 당 792 ns ± 1.83 ns (평균 ± 표준 편차 7 회, 각각 1000000 루프)

    file_name = 'test.mp3'
    extensions = ('.mp3','.avi')
    print(file_name.lower().endswith(extensions))
    %timeit file_name.lower().endswith(extensions)
    

    루프 당 274 ns ± 4.22 ns (평균 ± 표준 편차 7 회, 각각 1000000 루프)

  5. ==============================

    5.나는 이것을 가지고있다:

    나는 이것을 가지고있다:

    def has_extension(filename, extension):
    
        ext = "." + extension
        if filename.endswith(ext):
            return True
        else:
            return False
    
  6. ==============================

    6.나는 다른 것을 찾고있는 동안 이걸 보았습니다.

    나는 다른 것을 찾고있는 동안 이걸 보았습니다.

    os 패키지의 메소드를 사용하는 것이 좋습니다. 이는 이상한 경우를 보완하여 더 일반적으로 만들 수 있기 때문입니다.

    다음과 같이 할 수 있습니다.

    import os
    
    the_file = 'aaaa/bbbb/ccc.ddd'
    
    extensions_list = ['ddd', 'eee', 'fff']
    
    if os.path.splitext(the_file)[-1] in extensions_list:
        # Do your thing.
    
  7. ==============================

    7.또 다른 가능성은 IN 문을 사용하는 것입니다.

    또 다른 가능성은 IN 문을 사용하는 것입니다.

    extensions = ['.mp3','.avi']
    file_name  = 'test.mp3'
    if "." in file_name and file_name[file_name.rindex("."):] in extensions:
        print(True)
    
  8. from https://stackoverflow.com/questions/18351951/check-if-string-ends-with-one-of-the-strings-from-a-list by cc-by-sa and MIT license