打开txt文件并创建列表并获取基本统计信息

2024-09-28 21:44:49 发布

您现在位置:Python中文网/ 问答频道 /正文

我正试图打开一个名为state的文本文件_会议.txt文件;信息格式为

体操学校,参赛者姓名,获得的综合分数 参见示例:

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..

并创建函数以获取信息,例如:

参加国家运动会的体操运动员总数。 第一名的分数。 最后一名得分。 第一名和最后一名之间的分数差。 所有体操运动员的平均分。 中位数。(中位数是排序列表中点处的坡度。如果列表中有偶数个元素,则中间值是中间两个元素的平均值。) 高于中位数的所有分数的平均值(不包括中位数)。 低于中位数的所有分数的平均值(不包括中位数)。 输出应该是这样的

数据摘要: 体操运动员人数: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给我的错误


Tags: cityinputvalmin分数maxlist平均值
3条回答

您有一个逗号分隔值(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文件中的行,并自动将每一行转换为一个字典,由您喜欢的任何内容键入。这可能比dokelung答案中的collections.namedtuple建议更容易理解,尽管namedtuple同样有效。这里的关键是我们可以保持完整的记录,而不是丢掉一切,除了分数。你知道吗

split()在默认情况下对空白进行拆分,您的意思是 值=行。拆分(',') 用逗号分开?你知道吗

https://docs.python.org/2/library/stdtypes.html#str.split

  1. 应该使用split(',')替换split()。你知道吗
  2. 使用values[2]获取列表values的第三项。你知道吗
  3. 列表allt似乎没有用。你知道吗
  4. 似乎不管state_meet.txt中有多少行,values总是得到最后一行数据。你知道吗

我猜你想做的事情是:

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)

让我解释一下:

首先,我用项目名称(体操学校…)定义一个名为“Data”的namedtuple类型。然后我可以使用d = Data('school', 'name', '50.0')创建一个命名的双元组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'

接下来,当我们迭代file对象中的行时,使用string方法strip删除空格和新行。它使线路更干净。然后split(',')可以帮助我们用指定的分隔符,拆分行。 这里,我们使用函数float进行转换,因为分割列表items中的第三项是一个float(但它是文件中的字符串)。最后,使用namedtupleData创建数据,然后附加到listdata。你知道吗

接下来,内置函数maxmin可以帮助我们找到max/min项。但是数据中的每一个事物都是一个命名的元组,我们应该使用lambda函数来获取这些点,然后使用它们作为键来选择最大/最小值。 另外,函数sum让我们计算不带循环的求和。在这里,我们必须提取点以得到它们的总和,因此我们传递一个生成器d.all_around_points_earned for d in datasum。你知道吗

我通过排序data得到中间值,然后得到中间值。当数据数为奇数时,我们只需选取中心数。但如果是偶数,我们应该选择中间的“两个”并计算它们的平均值。你知道吗


希望我的回答能帮助你!你知道吗

相关问题 更多 >