2017-02-27 10 views
1
joe 10 15 20 30 40 
bill 23 16 19 22 
sue 8 22 17 14 32 17 24 21 2 9 11 17 
grace 12 28 21 45 26 10 
john 14 32 25 16 89 

上記のテキストファイル「studentdata.txt」を使用して、各生徒の平均成績を計算し、平均成績とともに生徒の名前をプリントするプログラムを作成しました。ここに私のコードです:ラムダ関数にするには?

with open('studentdata.txt','r') as f: 
    for line in f: 

     items = line.split() 

     total = 0 

     grades = items[1:] 

     for grade in grades: 

      total = total + int(grade) 

     print (items[0], (total/(len(grades)))) 

それは動作しますが、私はラムダ機能を使用して簡単にしたいです。これをどうやってやるの?

+0

私はラムダについて忘れて、既存の平均関数を使用する。 numpyのパッケージには私が思うものが1つあります。 – Elmex80s

+5

ラムダ関数の使用は簡単です。どの部分を簡素化したいですか? – alexis

+0

1つのラムダ式を実行するだけで、別のファイルでこれを実行できるようにしたい – chrischrischris

答えて

1

私は、学生の名前と、値:学生マークの平均、スペースに応じて分割し、ラムダを定義して平均値を計算する(辞書の理解度を使って)それまでの値、それはイテレータを消費することなく、その上にsumlenを計算することができるように):

with open(".txt") as f: 
    data = [{item.partition(" ")[0]:(lambda x:sum(x)/len(x))([int(x) for x in item.split()[1:]])} for item in f] 

結果:

[{'joe': 23.0}, {'bill': 20.0}, {'sue': 16.166666666666668}, {'grace': 23.666666666666668}, {'john': 35.2}] 

str.partition名前を返すために使用されます(最初のスペース文字に従って分割します)。

これは、リスト内包、辞書内包、およびラムダを含む1つのライナーです。複雑ではあるが論理的であり、実行可能である(splitの部分は、データが異質なので二重に処理されている)。マーク

+0

これは私が 'Jolie laide'と呼ぶものです –

+0

私はあなたが何を意味しているか知っています。時には1ライナー1)犠牲を要求し、2)必ずしも最善の解決策ではない。しかし、このようなlistcomps/dictcompsを持つ1ライナーは、機能的なアプローチのためにループを書いている間にたくさんの愚かなバグを避けています。 –

1

あなたはラムダ関数せずにこれを簡素化することができます。

# 1 
for line in open('studentdata.txt'): 
    items = line.split() 
    grades = items[1:] 

    # 2 
    total = sum(map(int, grades)) 

    # 3 
    print (items[0], total/len(grades)) 
  1. あなたはこの過度に複雑with構文せずに​​行ごとにファイルを反復処理することができます。デフォルトであるので、'r'引数も必要ありません。
  2. gradesの各値を整数に変換して合計します。
  3. 不要なかっこを削除しました。

あなたは、Python 3.xのを持っている場合は、コードを見ても、よりよい書くことができます。

for line in open('studentdata.txt'): 
    # 1 
    name, *grades = line.split() 

    # 2 
    total = sum(map(int, grades)) 
    print (name, total/len(grades)) 
  1. これはケーキのちょうど一枚です! line.splitから返されたリストから1つの値を抽出し、nameに置き換えます。 - リストにはgradesが残ります。
  2. 変数totalを取り除いて、printの呼び出しにsum(...)を移動してコード行を保存することはできますが、それは可読性を損なう可能性があるため、これはお勧めしません。
+0

ポイント1について:これはループを終了した後ファイルを閉じますか? – ImportanceOfBeingErnest

+0

@ImportanceOfBeingErnest、ガベージコレクタはそれを実行します。これはCPythonで保証されています。 – ForceBru