【问题标题】:Python average by length of a stringPython 按字符串长度计算平均值
【发布时间】:2015-04-12 14:53:36
【问题描述】:

我有一个数据文件,它在七列数字中包含六行数字。

例子:

5 8 3 21 10 99 3
14 20 100 34 94 2 3
4 2 102 330 101 3 9
9 22 77 721 30 4 9
99 3 4 1 0 55 8 4
8 90 3 1 99 4 101

我有以下代码,想知道如何求每行和每行的平均值。

def main():

    fileName = input("Enter the name of the data file: ")
    print()
    infile = open(fileName, "r")

#   get data

    sum = 0
    count = 0
    data = infile.read().strip().split()
    for line in len(data):
        sum = sum / len(data)

    print("This is sum: ", sum) 
main()

我只能打开文件一次,我必须用循环完成所有事情,这意味着我必须对驻留在第一个循环中的外观中的列和行进行所有数学运算。输出应该类似于:

在上交时,我的讲师可能会将数据文件设置为超过 7 列和 6 行。因此,代码必须能够适应这种变化。下面的输出来自另一个人,他有类似的程序要制作,但使用了固定的文件格式。如果添加了 5、10、15、20、25、95、100... 等新列或额外的汽车,则该代码将不起作用。

                           Speed (MPH)

   Car   :     30     40     50     60     70     80     90  : Average Noise

----------------------------------------------------------------------------

    1    :     88     90     94     98    100    110    120  :    100.0
    2    :     75     77     80     86     94    103    113  :     89.7
    3    :     80     83     85     94    111    111    121  :     97.9
    4    :     68     71     76     85     96    122    125  :     91.9
    5    :     77     84     91    102    105    112    119  :     98.6
    6    :     81     85     90     96    102    109    134  :     99.6

----------------------------------------------------------------------------

 Average :     78.2   81.7   86.0   93.5  101.3  111.2  122.0


 Maximum :     88     90     94    102    111    122    134

有人知道如何去做吗?一切都必须灵活地根据导入的数据文件进行更改。就像 Excel 工作表一样。

【问题讨论】:

  • 这不是本网站的运作方式。但是,为了帮助您入门,我建议您研究一下二维数组。
  • for line in len(data):... 整数不可迭代。
  • Anzel,当我试图获取一行代码时,我遇到了那个问题,以及其他所有的砖墙,并找到了一种方法来获取一行的总和,然后将它除以总数该行内的 int 数。在我看来,我需要长度,但我不知道如何正确获得该长度,然后在代码本身中使用它。就个人而言,我认为这是一项非常不具建设性的任务,因为 excel 将是一个更好的程序。对 Vineet,谢谢,我会研究一下二维数组。
  • 啊。我使用 NumPy 发布了答案。然后阅读我必须用循环完成所有事情
  • Vineet,这就是你所说的二维数组吗? myArray = [] infile = open(fileName, "r") lines = infile.readlines() for line in lines: myArray.append(line.split()) 结果:这是总和:[['88', '90 ', '94', '98', '100', '110', '120'], ['75', '77', '80', '86', '94', '103', '113 '], ['80', '83', '85', '94', '111', '111', 1'], ['68', '71', '76', '85', ' 96', '122', '125'], ['77', '84', '91', '102', '105', '112', '119'], ['81', '85' , '90', '96', '102', '109', '134']]

标签: python excel import range average


【解决方案1】:

几件事:

您需要围绕 len(data) 的 range() 函数进行迭代。

如果您想要一个平均值,那么您的方程式:sum = sum / len(data) 不会找到平均值。您必须对某处的值求和。目前你的取值为 0 / 某个值 = 0。如果你使用 sum += sum + data[line] / len(data),那将起作用。或者,您可以对循环中的值求和,然后除以条目数。这两种方法是等价的。在前者中,您只需在进行除法时将每个连续值添加到总和中。不过,就遵循代码而言,如果您执行后者可能会更清楚,分别显示每个步骤。

关于格式:我不想为此放弃所有内容,因为这似乎是您家庭作业的大部分内容,但会提供一些提示。 您应该跟踪每行中的条目数,并将条目的最大值存储在某个变量中。这样,当您格式化表格时,您可以调用此变量来指示您需要创建多少列。在调整行数方面,请使用 for 循环,其中循环的每次迭代都会生成一行。在开始这个 for 循环之前,让它制作标题(您的 ----- 行及其上方的所有内容),然后在 for 循环之后制作页脚(您的 ----- 行及其下方的所有内容)。

对于底部的最大值行,我建议您创建一个字典,以便在您遍历每一行时存储每列的最大值。使用列值作为键和一些逻辑来测试与键关联的存储值是否大于当前存储值,如果是,则替换它。

最后,您应该记得关闭您的文件。你一开始就打开了,但没有关闭。

希望这会有所帮助。

【讨论】:

    【解决方案2】:

    这就是我如何完成家庭作业

    首先读取 csv。但是,由于读取文件的正常方式会给我们字符串列表。所以,使用read_lines 函数——它将字符串列表转换为浮点数。

    import csv
    
    def read_lines(csvfile):
        with open(csvfile, 'rU') as data:
            reader = csv.reader(data)
            for row in reader:
                yield [float(cell) for cell in row ]
    
    cars = list(read_lines('car.csv'))
    cars
    
    [[88.0, 90.0, 94.0, 98.0, 100.0, 110.0, 120.0],
     [75.0, 77.0, 80.0, 86.0, 94.0, 103.0, 113.0],
     [80.0, 83.0, 85.0, 94.0, 111.0, 111.0, 121.0],
     [68.0, 71.0, 76.0, 85.0, 96.0, 122.0, 125.0],
     [77.0, 84.0, 91.0, 102.0, 105.0, 112.0, 119.0],
     [81.0, 85.0, 90.0, 96.0, 102.0, 109.0, 134.0]]
    

    查找 csv 文件的维度——汽车和速度。

    # Number of speeds
    speed_no = float(len(cars[0]))
    
    # Number of cars
    cars_no = float(len(cars))
    

    逐行,找出每行(汽车)在不同速度值上聚合的平均值。

    # Per car, average value across speed values
    for row, car in enumerate(cars):
        print row, sum(car)/speed_no
    
    0 100.0
    1 89.7142857143
    2 97.8571428571
    3 91.8571428571
    4 98.5714285714
    5 99.5714285714
    

    而且,我们需要一个函数来从数组(列表列表)中提取第 n 列

    def nth_col(passlist, n):
        return map(lambda x : x[n], passlist)
    

    最后,逐列找出速度值(即每个速度)的平均值、最大值

    # Per speed, max and average of car values
    for num in range(int(speed_no)):
        nth_car = nth_col(cars, num)
        print num, max(nth_car), sum(nth_car)/cars_no
    
    0 88.0 78.1666666667
    1 90.0 81.6666666667
    2 94.0 86.0
    3 102.0 93.5
    4 111.0 101.333333333
    5 122.0 111.166666667
    6 134.0 122.0
    

    但是,我更喜欢 NumPy/Pandas 版本而不是循环。

    Numpy 版本

    你可以使用NumPy

    In [30]: import numpy as np
    In [37]: np_arr = np.genfromtxt('car.csv', delimiter=',', skip_header=1)
    In [39]: np_arr
    Out[39]:
    array([[  88.,   90.,   94.,   98.,  100.,  110.,  120.],
           [  75.,   77.,   80.,   86.,   94.,  103.,  113.],
           [  80.,   83.,   85.,   94.,  111.,  111.,  121.],
           [  68.,   71.,   76.,   85.,   96.,  122.,  125.],
           [  77.,   84.,   91.,  102.,  105.,  112.,  119.],
           [  81.,   85.,   90.,   96.,  102.,  109.,  134.]])
    

    按列均值

    In [41]: np_arr.mean(axis=0)
    Out[41]:
    array([  78.16666667,   81.66666667,   86.        ,   93.5       ,
            101.33333333,  111.16666667,  122.        ])
    

    逐行平均

    In [42]: np_arr.mean(axis=1)
    Out[42]:
    array([ 100.        ,   89.71428571,   97.85714286,   91.85714286,
             98.57142857,   99.57142857])
    

    按列最大

    In [43]: np_arr.max(axis=0)
    Out[43]:
    array([  88.,   90.,   94.,  102.,  111.,  122.,  134.])
    

    我将留下Pandas 版本供您试用。

    【讨论】:

    • 而且,你有 我必须用循环完成所有事情 版本以及矢量化 NumPy 版本。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-15
    • 1970-01-01
    • 2021-05-18
    相关资源
    最近更新 更多