从文件计算平均值和总数

时间:2016-07-19 07:23:07

标签: python

Python初学者。 如何显示文件中的数据并计算每个人的总数/平均值? 如何在每次迭代中将值添加到for之外的变量,并且一旦迭代超过记录数量?

由于用户可以添加和删除数据,因此文件中的数据会有所不同,但数据结构如下:

PersonA;342;454;559;
PersonB;444;100;545;
PersonC;332;567;491;
PersonD;142;612;666;

我想这样呈现:

PersonA    342    454     559    TOTAL   AVERAGE
PersonB    444    100     545    TOTAL   AVERAGE
PersonC    332    567     491    TOTAL   AVERAGE
PersonD    142    612     666    TOTAL   AVERAGE

在此之后我还能写些什么才能做到正确?

def show_result():
    text_file = open('result.txt', 'r')

    for line in text_file:
        if ';' in line:
            line2 = line.split(";")
        print line2

with open("input.txt") as f:
    for line in f:

s = """PersonA;342;454;559;
PersonB;444;100;545;
PersonC;332;567;491;
PersonD;142;612;666;"""

for line in s.split("\n"):
    p, a, b, c, _ = line.strip().split(";")
    print("{}\t{}\t{}\t{}\t{}\t{}".format(p, a, b, c,
      sum([int(a), int(b), int(c)]),
      sum([int(a), int(b), int(c)]) / 3))

溶液:

def show_result():
    text_file = open('minigolf.txt', 'r')

    print "Name,Round1,Round2,Round3"
    for line in text_file:
        if ';' in line:
            line2 = line.split(";")[:-1]
        print line2

        line_total = sum(map(int, line2[1:]))
        line_average = line_total / len(line2[1:])
        print "Total: ", line_total
        print "Average: ", line_average

4 个答案:

答案 0 :(得分:2)

snapshot.exists()

输出:

s = """PersonA;342;454;559;
PersonB;444;100;545;
PersonC;332;567;491;
PersonD;142;612;666;"""

for line in s.split("\n"):
    p, a, b, c, _ = line.strip().split(";")
    print("{}\t{}\t{}\t{}\t{}\t{}".format(p, a, b, c,
      sum([int(a), int(b), int(c)]),
      sum([int(a), int(b), int(c)]) / 3))

修改

如果要从文件中读取,可以执行以下操作:

PersonA 342     454     559     1355    451.6666666666667
PersonB 444     100     545     1089    363.0
PersonC 332     567     491     1390    463.3333333333333
PersonD 142     612     666     1420    473.3333333333333

答案 1 :(得分:0)

要计算你可以做的total(假设你不想包含第一个索引,其中包含“PersonA”等):

line_total = sum(map(int, line2[1:]))

从那里,平均值也很简单:

line_average = line_total / len(line2[1:])

说明:

  • sum函数接受一个iterable(为了我们的目的将iterable视为一个列表)并使用适当的sum函数添加其所有内容。

  • [1:]称为列表拼接。使用此语法,您告诉Python您要创建一个新列表,其中包含从1位置开始的原始列表的内容。以下是几个例子:

    >>> a = [1, 2, 3]
    >>> b = [1:]
    >>> b
    [2, 3]
    

具体语法如下:[start_index : end_index] start_indexend_index可以留空,Python将分别填入列表的开头或结尾。

答案 2 :(得分:0)

我会这样做。也就是说,有很多方法可以在Pyhton中完成。

import pandas as pd

df = pd.read_csv('result.txt', sep=';',header=None)
del df[4]
df['AVERAGE'] = df[[1,2,3]].mean(axis = 1)
df['TOTAL'] = df[[1,2,3]].sum(axis = 1)

我使用pandas库进行此类操作。

输出:

    0           1       2       3       AVERAGE     TOTAL
0   PersonA     342     454     559     451.666667  1355
1   PersonB     444     100     545     363.000000  1089
2   PersonC     332     567     491     463.333333  1390
3   PersonD     142     612     666     473.333333  1420

答案 3 :(得分:0)

这适用于每个人和任何人数的任何值:

from collections import defaultdict

def myprint(lines):
    sum_dict = defaultdict(lambda: ([], 0, 0))

    for line in lines:
        data = line.strip().split(";")
        person = data[0].strip()
        values = [int(i) for i in data[1:] if i]
        sum_dict[person] = (values + sum_dict[person][0], sum(values)+sum_dict[person][1], len(values)+sum_dict[person][2])

    for person in sorted(sum_dict):
        values, total, nb = sum_dict[person]
        print "{}\t{}\t{}\t{}".format(person, '\t'.join([str(i) for i in values]), total, total/nb)

if __name__ == '__main__':

    import os
    if os.path.exists('result.txt'):
        with open('result.txt') as input:
            lines = input.readlines()
    else:
        s = """PersonA;342;454;559;
               PersonB;444;100;545;
               PersonC;332;567;491;
               PersonD;142;612;666;"""
        lines = s.split('\n')

    myprint(lines)