首页 > 解决方案 > 对文件中的列执行不同的操作

问题描述

我正在尝试编写代码来处理我的数字输入文件,然后对它们执行各种操作。例如,第一列是名称。第二个是小时费率,第三个是小时。文件看起来像这样,

John 15 8
Sam 10 4
Mike 16 10
John 19 15

我想通过,如果一个名字是重复的(示例中的约翰),它将平均第二个数字(小时费率),得到第三个数字(小时)的总和,并删除重复,留下 1 个约翰的平均工资和全部小时数。如果不是重复的,它将只输出原始条目。

我不知道如何跟踪重复项,然后转到该行的下一行。有什么方法可以在不使用 line.split() 的情况下做到这一点?

标签: python

解决方案


如果你把它分成几部分,这个问题会更容易。

首先,您要通读文件并将每一行解析为三个变量,即名称、小时费率和小时数。

其次,您需要处理第一个值(名称)的匹配。您需要某种数据结构来存储值;adict在这里可能是正确的。

第三,你需要在最后计算平均值(你不能一路计算它,因为你需要值的计数)。

把它放在一起,我会做这样的事情:

class PersonRecord:
    def __init__(self, name):
        self.name = name
        self.hourly_rates = []
        self.total_hours = 0

    def add_record(self, hourly_rate, hours):
        self.hourly_rates.append(hourly_rate)
        self.total_hours += hours

    def get_average_hourly_rate(self):
        return sum(self.hourly_rates) / len(self.hourly_rates)


def compute_person_records(data_file_path):
    person_records = {}

    with open(data_file_path, 'r') as data_file:
        for line in data_file:
            parts = line.split(' ')
            name = parts[0]
            hourly_rate = int(parts[1])
            hours = int(parts[2])

            person_record = person_records.get(name)
            if person_record is None:
                person_record = PersonRecord(name)
                person_records[name] = person_record
            person_record.add_record(hourly_rate, hours)

    return person_records


def main():
    person_records = compute_person_records()

    for person_name, person_record in person_records.items():
        print('{name} {average_hourly_rate} {total_hours}'.format(
            name=person_name,
            average_hourly_rate=person_record.get_average_hourly_rate(),
            total_hours=person_record.total_hours))

if __name__ == '__main__':
    main()

推荐阅读