2016-04-22 32 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同樣有效。這裏的關鍵在於我們可以保留整個記錄而不是扔掉除了分數以外的所有東西。