<ol>
<li>应该使用<code>split(',')</code>替换<code>split()</code>。你知道吗</li>
<li>使用<code>values[2]</code>获取列表<code>values</code>的第三项。你知道吗</li>
<li>列表<code>allt</code>似乎没有用。你知道吗</li>
<li>似乎不管<code>state_meet.txt</code>中有多少行,<code>values</code>总是得到最后一行数据。你知道吗</li>
</ol>
<hr/>
<p>我猜你想做的事情是:</p>
<pre><code>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)
</code></pre>
<hr/>
<p>让我解释一下:</p>
<p>首先,我用项目名称(体操学校…)定义一个名为“Data”的namedtuple类型。然后我可以使用<code>d = Data('school', 'name', '50.0')</code>创建一个命名的双元组<code>d</code>。通过使用<code>.</code>获取属性,我们可以很容易地获取项值。你知道吗</p>
<pre><code>>>> 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'
</code></pre>
<p>接下来,当我们迭代file对象中的行时,使用string方法<code>strip</code>删除空格和新行。它使线路更干净。然后<code>split(',')</code>可以帮助我们用指定的分隔符<code>,</code>拆分行。
这里,我们使用函数<code>float</code>进行转换,因为分割列表<code>items</code>中的第三项是一个float(但它是文件中的字符串)。最后,使用namedtuple<code>Data</code>创建数据,然后附加到list<code>data</code>。你知道吗</p>
<p>接下来,内置函数<code>max</code>和<code>min</code>可以帮助我们找到max/min项。但是数据中的每一个事物都是一个命名的元组,我们应该使用lambda函数来获取这些点,然后使用它们作为键来选择最大/最小值。
另外,函数<code>sum</code>让我们计算不带循环的求和。在这里,我们必须提取点以得到它们的总和,因此我们传递一个生成器<code>d.all_around_points_earned for d in data</code>到<code>sum</code>。你知道吗</p>
<p>我通过排序<code>data</code>得到中间值,然后得到中间值。当数据数为奇数时,我们只需选取中心数。但如果是偶数,我们应该选择中间的“两个”并计算它们的平均值。你知道吗</p>
<hr/>
<p>希望我的回答能帮助你!你知道吗</p>