2014-03-04 3 views
4

glob에있는 키와 함께 max 함수를 사용하여 디렉토리에서 특정 유형의 가장 어린 파일을 찾는 Python 2.7.3을 실행하는 컴퓨터에서 작성한 스크립트가 있습니다. 이 스크립트를 다른 컴퓨터로 옮겨서 Python 2.4.3을 실행하고 스크립트가 결과적으로 작동하지 않는다는 것을 발견했습니다.Python max()는 키워드 인수를 사용하지 않습니다.

문제는 다음 줄에 발생한다 : 나는 문서를 검토 한 열쇠로 모두 iglob 및 최대 파이썬 2.5까지>

I 사용할 수없는 것을 볼 수 있습니다

newest = max(glob.iglob(bDir + '*.[Dd][Mm][Pp]'), key=os.path.getctime) 

iglob 참조를 glob로 바꿀 수 있으며 잘 작동하는 대소 문자 구분을 제거 할 수 있습니다. 하지만 키와 함께 max를 사용하지 않고 위의 코드를 다시 작성하는 방법을 모르겠습니다.

+11

10이 아닌 Python 버전을 설치하십시오 살이에요? –

+0

프로덕션 서버이므로 실행중인 Python 버전을 변경할 수 없습니다. 그렇지 않으면 나는 그 질문을하는 대신에 그것을했을 것입니다. 나는 또한 다른 버전의 Python을 altinstall 할 수 없다. – opmon5

답변

7

파이썬 2.4에서 어떤 도구에 액세스 할 수 있는지는 확실하지 않지만, 여전히 목록의 이해력이 있으므로 사용하려는 키와 함께 목록을 비교하고 비교 한 다음 압축을 풀 수 있습니다. 튜플은 요소별로 비교하기 때문에 작동합니다. 튜플의 맨 앞에 "키"를두면 기본 비교 자로 작동합니다.

# Note: untested 
times_files = [(os.path.getctime(f),f) for f in glob.glob(bDir+'*.[Dd][Mm][Pp]')] 
newest = max(timed_files)[1] # grab the filename back out of the "max" tuple 

다른 방법으로 (그리고 가능성이 더 빨리, 그것은 사용 사례에 대한 중요한 경우) @jonrsharpe pointed out로의 sorted 기능 key 인수를 허용, 당신은 또한 일종의 목록 수 있도록 마지막을 잡아 않습니다 항목 : 파이썬 2.4.x에서에서

newest = sorted(glob.glob(bDir + '*.[Dd][Mm][Pp]'), key=os.path.getctime)[-1] 
+0

이것은 즉각적인 응답 덕분에 완벽하게 작동했습니다. – opmon5

6

, sortedkey 않습니다; 고전 DSU 방법을 사용하여, 그냥 자신의 쓰기

newest = sorted(glob.glob(bDir + '*.[Dd][Mm][Pp]'), key=os.path.getctime)[-1] 
+0

이것도 완벽하게 작동했습니다. 감사합니다. – opmon5

1

을 : 당신이 당신의 glob이 적용 예를 들어, 마지막 항목을 취할 수 당신이 뭔가를 할도 수

try: 
    # At least give it a chance, in case a modern version of Python is running, 
    # it would be faster 
    my_max = max(my_list, key=my_func) 
except: 
    my_decorated = [(my_func(x), x) for x in my_list] 
    my_max = max(my_decorated)[1] 

를 그 위에, 코드에서이 작업을 많이해야하고 모든 위치에이 코드를 넣고 싶지 않으면 내장 된 max 함수를 재정의하십시오.