2017-11-14 5 views
1

일련의 값에서 난수를 가져 오는 스크립트가 있습니다. 그러나 min()max()은 사전 순으로 값을 정렬하므로 (200은 10000보다 큰 것으로 간주 됨) 오늘 깨졌습니다. 사전 편집 순서를 어떻게 피할 수 있습니까? Len 키가 올바른 트랙에 있지만 올바르게 맞지 않습니다. 도움이 될만한 다른 키를 찾을 수 없습니다.Python min()으로 숫자 값의 사전 식 정렬을 피하십시오. max()

data_set = 1600.csv, 2405.csv, 6800.csv, 10000.csv, 21005.csv 

첫 번째 시도 :

highest_value = os.path.splitext(max(data_set))[0] 
lowest_value = os.path.splitext(min(data_set))[0] 

반환 : lowest_value = 10000highest_value = 6800

두 번째 시도 :

highest_value = os.path.splitext(max(data_set,key=len))[0] 
lowest_value = os.path.splitext(min(data_set,key=len))[0] 

반환 : lowest_value = 1600highest_value = 10000

감사합니다.

+0

당신은'key = int'을 시도 했습니까? –

+0

'int'와 같이'ValueError'를 올리면 @Paul이됩니다. 물론, 나는 그의 데이터 세트 요소가 문자열이라고 가정하고있다. –

+0

@ChristianDean 내 데이터 세트는 본질적으로 폴더에있는 수치 적으로 명명 된 파일의'dir '이므로,'splitext'는 도움이됩니까? –

답변

3

당신은 파일의 숫자 부분에 의해 주문 key를 사용할 수 있습니다

data_set = ['1600.csv', '2405.csv', '6800.csv', '10000.csv', '21005.csv'] 

highest = max(data_set, key=lambda x: int(x.split('.')[0])) 
lowest = min(data_set, key=lambda x: int(x.split('.')[0])) 

print(highest) # >> 21005.csv 
print(lowest) # >> 1600.csv 
+0

고맙습니다 .. 내가 이해하는 것은 lambda가 확장을 분할하고 int로 변환 한 다음 max/min으로 정렬하는 것입니다. 올바른가요? 나는 결코 람다를 사용하지 않았다 –

+0

예, "람다"는 다르게 쓰여진 함수이다. 이 경우 람다 함수는 파일의 이름을 숫자 부분과 'csv'부분으로 나누고 숫자 부분을 int로 변환합니다. max/min 함수는 int 부분을 사용하여 최대/최소값을 결정합니다. 람다 식을 사용하는 대신 "normal"함수를 써서이 작업을 수행 할 수도 있습니다. 이런 식으로 크리스챤 학장의 다른 대답이 생겼습니다. – LeopoldVonBuschLight

2

당신은 가까웠다. 오히려 len 기능 splittext의 결과를 사용하는 것보다, 대신 int 기능을 사용 : 물론

>>> from os.path import splitext 
>>> data_set = ['1600.csv', '2405.csv', '6800.csv', '10000.csv', '21005.csv'] 
>>> def convert_to_int(file_name): 
     return int(splitext(file_name)[0]) 

>>> min(data_set, key=convert_to_int) 
'1600.csv' 
>>> max(data_set, key=convert_to_int) 
'21005.csv' 

,이 솔루션은 파일 이름이 전적으로 수치로 구성한다고 가정합니다.

+0

이것은 효과가 있었지만 레오폴드의 대답뿐만 아니라 내 상황에 맞지 않습니다. 그래도 고마워. –