2016-04-22 24 views
0

我想打开一个名为state_meet.txt文件的文本文件;该信息被格式化为打开txt文件和创建列表并获取基本统计信息

gymnastics_school,PARTICIPANT_NAME,全around_points_earned 见例如:

Lanier City Gymnastics,Ben W.,55.301 
Lanier City Gymnastics,Alex W.,54.801 
Lanier City Gymnastics,Sky T.,51.2 
Lanier City Gymnastics,William G.,47.3 etc.. 

,并创建函数来获得信息,如:

在参加国家体操运动员的总数遇到。 第一名得分。 最后一位得分。 第一个和最后一个地方之间的得分差异。 所有体操运动员的平均分数。 平均分数。 (中位数是排序列表中点的等级,如果列表中有偶数个元素,则中位数是2个中间元素的平均值。) 所有高于中位数的分数的平均值(不包括中值)。 所有得分低于中位数的平均值(不包括中位数)。 输出应该为这种数据

摘要: 体操运动员数:103 第一名成绩:143.94 下面的代码我到目前为止:

with open('state_meet.txt','r') as f: 
for line in f: 
    allt = [] 
    values = line.split() 
print(values[3]) 

#first 
max_val = max(values[3]) 
int(max_val) 

print(max_val) 


#last 
min_val = min(values[3]) 
int(min_val) 

print(min_val) 

#Mean 
total = sum(input_list) 
length = len(input_list) 
for nums in [input_list]: 
mean_val = total/length 
float(mean_val) 


#Median 
sorted(input_list) 
med_val = sorted(lst) 
lstLen = len(lst) 
index = (lstLen - 1) // 2 

这是我迄今为止但我的文字读它为W.的55.301代替55.301和给我的错误

回答

0
  1. 您应该使用split(',')更换split()
  2. 使用values[2]获得列表values的第三项。
  3. 列表allt似乎没有用。
  4. 看来,不管有多少行是那里state_meet.txtvalues总是得到最后一行数据。

我想的事情你想做的事:

import collections 
names = ["gymnastics_school", "participant_name", "all_around_points_earned"] 
Data = collections.namedtuple("Data", names) 

data = [] 

with open('state_meet.txt','r') as f: 
    for line in f: 
     line = line.strip() 
     items = line.split(',') 
     items[2] = float(items[2]) 
     data.append(Data(*items)) 

# max value 
max_one = max(data, key=lambda d:d.all_around_points_earned) 
print(max_one.all_around_points_earned) 

# min value 
min_one = min(data, key=lambda d:d.all_around_points_earned) 
print(min_one.all_around_points_earned) 

# mean value 
total = sum(d.all_around_points_earned for d in data) 
mean_val = total/len(data) 
print(mean_val) 

# median value 
sorted_data = sorted(data, key=lambda d:d.all_around_points_earned) 
if len(data)%2==0: 
    a = sorted_data[len(data)//2].all_around_points_earned 
    b = sorted_data[len(data)//2-1].all_around_points_earned 
    median_val = (a+b)/2 
else: 
    median_val = sorted_data[(len(data)-1)//2].all_around_points_earned 
print(median_val) 

让我解释更多:

首先,我定义一个名为 “数据” 与一个namedtuple类型项目名称(gymnastics_school ...)。然后我可以使用d = Data('school', 'name', '50.0')创建一个namedtuple d。我们可以使用.来轻松获取项目值以获取属性。

>>> names = ["gymnastics_school", "participant_name", "all_around_points_earned"] 
>>> Data = collections.namedtuple("Data", names) 
>>> d = Data('school', 'name', '50.0') 
>>> d.gymnastics_school 
'scholl' 
>>> d.participant_name 
'name' 
>>> d.all_around_points_earned 
'50.0' 

接下来,当我们遍历文件对象,使用字符串的方法strip行删除空白和新线。它使线更加干净。然后split(',')可以帮助我们分割具有指定分隔符,的行。 在这里,我们使用函数float进行转换,因为分割列表items中的第三项是一个浮点数(但它是文件中的字符串)。最后,使用namedtuple Data创建数据,然后附加到列表data

接下来,内建函数maxmin可以帮助我们找到最大/最小项目。但是,数据中的每一件事都是一个命名的组件,我们应该使用lambda函数来获取点,然后使用它们作为键来选择最大/最小值。 此外,功能sum让我们计算没有回路的总和。在这里,我们必须提取分数以得到它们的总和,所以我们将发生器d.all_around_points_earned for d in data传递给sum

我通过排序data得到中间值,然后得到中间值。当数据数量很奇怪时,我们只需选择中心号码。但是,如果它是偶数,我们应该选择中间的“二”并计算它们的平均值。


希望我的回答能帮助你!

+0

中间部分给我错误 –

+0

请尝试新的 – dokelung

1

您有逗号分隔值(csv)文件。使用csv模块。

import csv 

data = [] 

with open("state_meet.txt") as f: 
    reader = csv.DictReader(f, fieldnames=["school", "participant", "score"]) 
    for line in reader: 
     data.append(line) 

# first place 
record = max(data, lambda d: d["score"]) 
best_score = int(record["score"]) 

# last place 
record = min(data, lambda d: d["score"]) 
worst_score = int(record["score"]) 

# Mean score 
mean = sum(d["score"] for d in data)/len(data) 

# Median score 
median = sorted([d["score"] for d in data])[(len(data) - 1) // 2] 

csv.DictReader读取CSV文件的行,并自动转换成每一个字典,通过任何你喜欢的关键字。这可能比dokelung的回答中的collections.namedtuple建议更容易阅读,尽管namedtuple同样有效。这里的关键在于我们可以保留整个记录而不是扔掉除了分数以外的所有东西。