<p>当然有很多方法。最简单的方法可能只是检查“W”字符串并继续下一行</p>
<p>实现这一点的一种方法是使用<a href="https://docs.python.org/3/tutorial/controlflow.html#break-and-continue-statements-and-else-clauses-on-loops" rel="nofollow noreferrer">continue</a>控件继续循环中的下一个迭代</p>
<pre class="lang-py prettyprint-override"><code>def loaddata(filename, course):
count = 0
total = 0.0
with open(filename, 'r') as f:
lines = csv.reader(f)
next(lines)
for row in lines:
if row[3] == 'W':
continue # Go to next iteration in loop
if course in row[0]:
get_grade = findnumericgrade(row[3])
total += float(get_grade)
count += 1
avg = total / count
print(f"The {course} average is: {round(avg, 2)}")
</code></pre>
<hr/>
<p>您还可以通过将if语句设置为<code>and</code><a href="https://docs.python.org/3/reference/expressions.html?highlight=boolean#boolean-operations" rel="nofollow noreferrer">boolean operation</a>来实现这一点,以确保课程成绩不是“W”</p>
<pre class="lang-py prettyprint-override"><code>def loaddata(filename, course):
count = 0
total = 0.0
with open(filename, 'r') as f:
lines = csv.reader(f)
next(lines)
for row in lines:
if course in row[0] and row[3] != 'W':
get_grade = findnumericgrade(row[3])
total += float(get_grade)
count += 1
avg = total / count
print(f"The {course} average is: {round(avg, 2)}")
</code></pre>
<hr/>
<p>上面的解决方案可能是最实用的,因为这看起来像某种实用程序脚本,但是根据您期望数据集的大小,您可以使用类似<a href="https://pandas.pydata.org/" rel="nofollow noreferrer">pandas</a>的东西。然后您就可以访问它提供的所有数据操作和分析工具</p>
<pre class="lang-py prettyprint-override"><code>import sys
import pandas as pd
def find_numeric_grade(grade):
if grade == 'A':
return 4.0
elif grade == 'B':
return 3.0
else:
return 2.0
df = pd.read_csv('studentdata.csv')
section_number = int(sys.argv[1])
print(df[(section_number == df['Section_Number']) & (df['Course_Grade'] != 'W')]
['Course_Grade'].apply(find_numeric_grade).mean())
</code></pre>
<p>*使用<strong>studentdata.csv中的以下数据测试解决方案</p>
<pre><code>Section_Number,Prof_ID,Student_ID,Course_Grade,Student_Name,Course_ID
14224,5,109,B,John Smith,IT1130
14224,5,110,B,Jennifer Johnson,IT1130
14224,5,111,W,Kristen Hawkins,IT1130
14224,5,112,A,Tom Brady,IT1130
14224,5,113,C,Cam Newton,IT1130
14224,5,114,C,Tim Tebow,IT1130
14225,5,115,A,Peyton Manning,IT1130
14225,5,116,B,Maria Sharapova,IT1130
14225,5,117,W,Brian McCoy,IT1130
</code></pre>