python - 对文件中的列执行不同的操作
问题描述
我正在尝试编写代码来处理我的数字输入文件,然后对它们执行各种操作。例如,第一列是名称。第二个是小时费率,第三个是小时。文件看起来像这样,
John 15 8
Sam 10 4
Mike 16 10
John 19 15
我想通过,如果一个名字是重复的(示例中的约翰),它将平均第二个数字(小时费率),得到第三个数字(小时)的总和,并删除重复,留下 1 个约翰的平均工资和全部小时数。如果不是重复的,它将只输出原始条目。
我不知道如何跟踪重复项,然后转到该行的下一行。有什么方法可以在不使用 line.split() 的情况下做到这一点?
解决方案
如果你把它分成几部分,这个问题会更容易。
首先,您要通读文件并将每一行解析为三个变量,即名称、小时费率和小时数。
其次,您需要处理第一个值(名称)的匹配。您需要某种数据结构来存储值;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()
推荐阅读
- python - Python 使用 json 文件中的信息创建 .txt
- php - Paypal 结帐 - 订单捕获从服务器获取 PERMISSION-DEINED 但在 javascript 客户端中工作
- awk - 在 awk 中删除带有特殊字符的行
- spring - Spring Security 基本身份验证密码轮换问题
- java - Java中的向量总是用最后一个值覆盖所有内容
- google-cloud-platform - GCP Artifact Registry - 仅在不存在时创建 repo
- td-engine - 如何查看我正在使用的 TDengine 数据库的版本?
- mysql - FDQuery 进度条接口 - DELPHI
- iis - 添加
在 webconfig 中导致 IIS 中的子应用程序出现 500 错误? - python - 为什么 Django 在 /articles/3/ Reverse 中显示 NoReverseMatch 为 'article_edit' 并没有找到参数 '('',)'。尝试了 1 种模式:[]