通过文件找到平均pH值

2024-06-02 07:27:03 发布

您现在位置:Python中文网/ 问答频道 /正文

我的代码应该计算并打印给定文件变量名的每种流体的平均pH值。
到目前为止,我一直在尝试使用split()将txt文件分割成多个部分。
我真的不知道如何把函数一行一行地分开来计算每个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")

文件-名称:pH.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

Tags: 文件nametxtiflinenotresultvariable
3条回答

孩子,从哪里开始?你知道吗

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

首先,list是Python中内置类型的名称,虽然您可以通过将它用作变量名来掩盖这一点,但为了避免混淆自己和其他人,您确实不应该:

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

好的,这样更好。lst是类的实例,现在仍然可以称为list。现在,您的if lst.isnum:似乎试图测试该实例的方法的输出。但是在Python中,如果不键入括号,就不能调用方法。如果没有括号,当前,您的if语句将询问指向方法本身的指针是否为非零,对于存在的方法,该指针始终为真。。。你知道吗

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

好的,这样更好。但请注意,我说过,“…对于存在的方法”。isnum不是list类的方法,因此代码只会在这里引发异常。您可能是指字符串方法.isnumeric

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

当然,这仍然是错误的。您要测试列表中的项目是否为数字。因此,需要调用每个项的函数或方法,而不是调用列表本身的函数或方法。尽管字符串有一个isnumeric方法,但是list类(我们的lst变量所属)没有。一个优雅的方法是使用“列表理解”:

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值列表/平均值与其各自的物质相关联,否则关联信息将丢失/损坏。使用dict有一些简洁的方法可以做到这一点,尽管目前有一个名为found的变量未使用,这表明您可能打算执行以下操作:

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

(注意:如果这样做,请在要检查每条线的循环中执行,以查看它是否是目标。)

现在,关于你的result += lst。。。好吧,你把result初始化为0,所以它是一个整数,而lst我们知道是一个list。你不能把一个list加到一个整数上,这是没有意义的。您可能想做的是sum列表中的值(您甚至不需要result):

    avg = sum(lst) / len(lst)

注意,我是除以lst的长度,而不是硬编码其中的数字3。像这样的硬编码假设是为你未来的自我设下难以发现的陷阱的一个非常有效的方法,所以让我们避免它。你知道吗

祝你好运。你知道吗

我的解决方案:

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

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

相关问题 更多 >