2016-11-28 10 views
-1

私のコードは、ファイル変数名が与えられたすべての流体の平均pHを計算して出力することになっています。
これは、これまでのところ、txtファイルをsplit()を使用して部分に分割しようとしています。
私は実際に各pHを計算し、それを別々に印刷するために関数を行ごとに分ける方法を知らない。 pH値:指定 - それは最も可能性の高い第一のスロットファイルを介して平均pHを見つける

機能

def average_ph(file_variable): 

    result = 0 
    line = file_variable.readline() 
    found = False 
    while line != "" and not found: 
     list = line.strip().split(",") 
     if list.isnum: 
      result += list 
    if line != "": 
     avg = result/3 
    if not found: 
     result = None 
     print(avg) 
    return avg 

メイン

file_name = str(input("Enter a file name: ")) 
file_variable = open(file_name, "r", encoding="utf-8") 

ファイルに番号が表示されませんので、

は、今のところは、何も出力しません。 txt

Lemon juice,2.4,2.0,2.2 
Baking soda (1 Tbsp) in Water (1 cup),8.4,8.3,8.7 
Orange juice,3.5,4.0,3.4 
Battery acid,1.0,0.7,0.5 
Apples,3.0,3.2,3.5 
+0

はじめに、インデントが正しくありません。コードは、関数の署名と比較して字下げする必要があります。 – HakRo

+0

ええ、そうだよ – IncognitoBatman

+0

1) 'for line in file:'を使ってファイルをループすることができる。2)あなたの変数に 'list'という名前をつけないでください。 –

答えて

1

ボーイ、?

list = line.strip().split(",") 
if list.isnum: 

まず、listはPythonでタイプを内蔵しており、あなた、自分自身と他のみんなを混乱しないため、変数名としてそれを使用することによって、あなたのことを曇らせることができながらの名前です。本当にすべきではありません:

lst = line.strip().split(",") 
if lst.isnum: 

OK、それは良いです。 lstは、今でもなおlistと呼ばれるクラスのインスタンスです。今、あなたのif lst.isnum:は、そのインスタンスのメソッドの出力をテストしようとしているようです。しかし、Pythonでは、かっこを入力しなくてもメソッドを呼び出すことはできません。括弧がなければ、現在、あなたのifのステートメントは、メソッド自体からポインタが非ゼロ、存在する方法のため、常にtrueになるだろう...

lst = line.strip().split(",") 
if lst.isnum(): 

OKであるかどうか、それは良いでしょう求めています。私が言ったことを除いて、 "...存在する方法のために"。 isnumlistクラスのメソッドではないため、ここで例外が発生します。

lst = line.strip().split(",") 
if lst.isnumeric(): 

しかし、もちろん、これはまだ間違っている:あなたは、おそらく文字列メソッド.isnumericを意味します。項目であるかどうかをテストする場合は、リストが数値である必要があります。したがって、各項目の関数またはメソッドを呼び出す必要があります。はリスト自体のではありません。文字列にはisnumericメソッドがありますが、(lst変数が属する)listクラスはありません。

lst = line.strip().split(",") 
lst = [item for item in lst if item.isnumeric()] 

しかし、実際には数値に文字列から項目を変換しません。もちろん、この周りに一つのエレガントな方法は、「リストの内包表記」を使用することです。あなたは本当にの文字列をまとめて3で割ることができると思いましたか?

lst = line.strip().split(",") 
lst = [float(item) for item in lst if item.isnumeric()] 

これで、数値で操作できる実際の浮動小数点数のリストが作成されました。しかし、私たちは、測定している物質についての情報を捨てました。

lst = line.strip().split(",") 
substance = lst.pop(0) # remove and store the first item in the list 
lst = [float(item) for item in lst if item.isnumeric()] 

私は、あなたが何らかの形で、それぞれの物質-そう連想情報は、/破損迷子しようとしていることで、各pH値リスト/平均を関連付けることを示唆しています。現在、あなたは未使用-示唆あなたのような何かをしようとすることができることであるfoundという変数持っているがdictであることを行うためのきちんとした方法は、あります

if substance == the_particular_substance_we_are_currently_interested_in: 
    found = True 
    avg = ... 

を(注:この操作を行う場合には、やりますそれあなたのresult += lst用として...さて、あなたはそれが整数だ0resultを初期化内部ループあなたはそれが目標だ場合は結局、見にラインを確認したい。)今

、 、およびlstがわかっているので、listlistを整数に追加することはできません。意味がありません。あなたはおそらくやりたいこと(そしてあなたもresultを必要としません)sumリスト内の値である:私はlstのどんな長さで割るんだ

avg = sum(lst)/len(lst) 

注意ハードコーディングするのではなく、ありますそこの番号3。そのようなハードコーディングの前提は、あなたの将来の自己のために見つけにくいトラップを設定する本当に効果的な方法なので、それを避けましょう。

幸運。

+0

ヒーローはすべて岬を着用しているわけではありません。そして、あなたはそれらの一人です。微妙な詳細な説明をくれてありがとう、あなたは私の将来のコーディングのためのすべてのヒントをくれた。 – IncognitoBatman

+1

私は岬を着用していないと誰が言う? – jez

2

Python3にはbuilt-in mean functionがあります。

ファイルを正しく読み込み、データを分割する方法を理解するだけです。出力として

from statistics import mean 

with open("pH.txt") as f: 
    for line in f: 
    data = line.split(",") 
    ph_values = map(float, data[1:]) 
    print("{}, avg = {:.02f}".format(data[0], mean(ph_values)) 

Lemon juice, avg = 2.20 
Baking soda (1 Tbsp) in Water (1 cup), avg = 8.47 
Orange juice, avg = 3.63 
Battery acid, avg = 0.73 
Apples, avg = 3.23 
1

私のソリューションが表示されるはずです。

def average(numbers): 
    return float(sum(numbers))/max(len(numbers), 1) 


def read_average(filename): 
    with open(filename) as f: 
     dict 
     lines = f.readlines() 
     for line in lines: 
      data = line.split(',') 
      name = data[0] 
      avg = average([float(i) for i in data[1:]]) 
      print("{name}: {avg}".format(name=name, avg=avg)) 

read_average('pH.txt') 

出力:開始する

Lemon juice: 2.2 
Baking soda (1 Tbsp) in Water (1 cup): 8.466666666666667 
Orange juice: 3.6333333333333333 
Battery acid: 0.7333333333333334 
Apples: 3.233333333333333 
関連する問題