2017-08-31 13 views
0

私は指定されたファイルの中で最も大きい整数を返す関数を書くことに取り組んでいます。ファイルには数字だけが含まれています。私は次のコードを思いついた。ファイル内のPythonの最大の整数

def max_num_in_file(filename): 
    """DOCSTRING""" 
    with open(filename, 'r') as file: 
     return max(file.read()) 

私は、私が作成したテキストファイルでこれをテストするとき、それはファイルの行のいずれかで最高を返します。一桁ではなく、全体で最高の数字を返す必要があります。

with open(path, 'r') as file: 
    m = max(file.readlines(), key=lambda x: int(x)) 

はその後mは、文字列としてファイルの最大数を保持し、int(m)は、あなたが探している値である:あなたのファイルを想定し

+2

データの例を追加してください。 – zipa

+1

'file.read()。split()]でxを返すことができますか? – sauerburger

答えて

1

は、1行に1つずつ番号が含まれています。

file.readlines()は、要素がファイルの行であるリストを提供します。 max組み込み関数は、iterable(ここでは行のリスト)とオプションのkey引数をとります。 引数は、どのように要素を比較するかを指定します。

私のiterableの要素は、整数を表す文字列です。 したがって、それらを整数として比較したいと思います。 私のkeylambda x: int(x)です。これは、xを入力するとint(x)を返す無名関数です。


max(file.read())はなぜ機能しませんでしたか?

file.read()には、ファイルの内容全体に対応する文字列が表示されます。 さらに、maxは、渡されるiterableの要素を比較し、要素の型に定義された順序関係に従って、最大のものを返します。 文字列(strインスタンス)の場合、辞書順です。

ファイルに数字だけが含まれている場合、すべての文字が数字であり、最大の要素は最大の数字に対応する文字です。 したがって、max(file.read())はほとんどの場合、'9'を返す可能性が最も高いです。

+0

問題の関数は数値を返さなければならないので、スニペットはmを' int'に変換する方が良いでしょう。終わり。 – void

+0

@voidそれはニックピッキングです:)しかし、あなたは正しいです、私はそれを編集しました。 –

0

ファイルがクリーンであると空い/非番号ラインがない限り:

def max_num_in_file(filename): 
    """DOCSTRING""" 
    with open(filename, 'r') as file: 
     return max([int(_x.strip()) for _x in file.readlines()]) 
0
d=f.read() 
max(map(int,d.split())) #given that file contains only numbers separated by ' ' 

# if file has other characters as well 
max(map(int,[i for i in d.split() if i.isdigit()])) 
0

あなたはファイルオブジェクトを反復処理し、intに各行を変換する必要があります( )。ファイルが非常に大きい場合、私はメモリに巨大なリストを配置するので、readlines()を使ってもう一度アドバイスします。仕事をするイテレータを使用することをお勧めI'ts、一度に1行を反復:

def max_num_in_a_file(filename): 
    def line_iterator(filename): 
     with open(filename) as f: 
      for line in f: 
       yield int(line) 
    return max(line_iterator(filename)) 

は、ファイル内の任意の行がint()オブジェクトに変換されていない場合、スクリプトが例外をスローします注意してください。次のように、そのような場合のために、あなたのイテレータを保護し、ちょうどラインをスキップすることができます

def max_num_in_a_file(filename): 
    def line_iterator(filename): 
     with open(filename) as f: 
      for line in f: 
       try: 
        num = int(line) 
       except ValueError: 
        continue 
       yield num 
    return max(line_iterator(filename)) 

この関数は、数字や他のデータとファイルのために働くだろう、とだけ(int型に変換可能でない行をスキップします) 。

0

あなたもそれを通過することができます。

def max_num_in_file(filename): 
    """DOCSTRING""" 
    with open(filename, 'r') as file: 
     # read every line and converting into list 
     ls = [x.strip().split() for x in file.readlines()] 
     return max(map(int, sum(ls, []))) 
     # sum(ls,[]) is used for converting into a single list 
     # map() is used for convert string to int 
関連する問題