2017-11-14 6 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

2回目の試行:

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部分を使用して、最大/最小値を決定します。ラムダ式を使用する代わりに、これを行うための "通常の"関数を書くこともできます。これは、クリスチャン・ディーンからの他の答えがこのようになったようです。 – 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

これはうまくいきましたが、私の状況やLeopoldの答えに合っていません。それでも、ありがとう。 –

関連する問題