2017-12-22 26 views
-2

.csvファイルから行平均を計算し、各行の平均のリストを返そうとしています。現在入手可能ですリストのリストからアポストロフィを削除する方法

in_ = [['1,2'], ['1,1,1,1'], ['-1,0,1'], ['42,17']] 

個々のリストを平均化するためにアポストロフィを削除する必要があります。私はint()を使ってみましたが、運がなかった。

マイ所望の出力

out = [[1, 2], [1, 1, 1, 1], [-1, 0, 1], [42, 17]] 

は私の現在のコードは次のとおりです。

def line_averages(filename): 
    """takes a file and returns the average values of each line in a 
    .csv file""" 
    f = open(filename, 'r') 
    lines = f.readlines() 
    #print(lines) 
    f.close() 
    words = [] 
    for line in lines: 
     words.append(line.split()) 
    for i in words: 
     words.replace("'", "") 
    return words 
+1

リスト要素全体が1つの文字列であるためです。 '、'を最初に分割してからintにキャストしようとする –

+2

*「アポストロフィを削除する」*「文字列を整数に変換する」という意味ですか?それは検索する方が簡単かもしれません。 – jonrsharpe

+0

csvファイルから読み込むコードを表示できますか?煩雑な後処理ステップなしで自動的にこれを行う方法があるかもしれません。 – Kevin

答えて

3

あなたがここにCSVリーダーホイールを再発明しています。代わりにcsv moduleを使用して分割を処理してください。

def line_averages(filename): 
    """takes a file and returns the average values of each line in a 
    .csv file""" 
    with open(filename, 'r', newline='') as f: 
     reader = csv.reader(f) 
     for row in reader: 
      yield [int(c) for c in row] 

これは発電機を生成し、反復は、整数であなたに行を与える:私たちは、整数のみに文字列の列を変換する必要があります。また、リストのリストを返すことができ

for row in line_averages(some_file_name): 
    # do something with each row 

def line_averages(filename): 
    """takes a file and returns the average values of each line in a 
    .csv file""" 
    with open(filename, 'r', newline='') as f: 
     reader = csv.reader(f) 
     return [[int(c) for c in row] for row in reader] 

あなたの試行は、空白で、で区切り、コンマではありません。あなたは明示的に','に分割する必要があり、かつ整数にあなたの列を変換したい:

def line_averages(filename): 
    """takes a file and returns the average values of each line in a 
    .csv file""" 
    with open(filename, 'r') as f: 
     return [[int(c) for c in line.split(',')] for line in f] 

私は整数のリストにファイルから各行を変換する、リストのリストを生成するために、ここでnested list comprehensionsを使用しました。

私はcontext manager in a with statementとしてもこのファイルを使用しました。これは、管理対象ブロック内で何が起きてもファイルが閉じられることを保証します。手動で閉じる必要はありません。

このファイルは、イテレータとしても使用されます。;反復するたびに(forループのように)、ファイル内の次の行を取得します。 file.readlines()ですべての行を先頭から読む必要はありません。

+0

返信ありがとうございます。この正確なコードを使用すると、次のように出力されます。

+0

@SebTerry:はい、イテレータがあります。これを 'for'ループで使用できるようになりました。 –

関連する問題