1

我正在尝试从 Excel 文档中计算给定列中特定值的所有变量。我希望能够遍历该列并计算每个实例的总数……例如,有多少学生获得了“A”级。

这是我到目前为止...

测试.xls:

姓名、班级、年级

詹姆斯,数学,一个

朱迪,数学,一个

比尔,社会研究,B

丹尼斯,历史,C

莎拉,历史,B

这是我的python脚本

import xlrd
from collections import Counter
sh = xlrd.open_workbook('test.xls', on_demand = True).sheet_by_index(0) # Open workbook and sheet

 for rownum in range(sh.nrows):
    grades = str(sh.cell(rownum, 2).value) # Grab all variables in column 2.
    print Counter(grades.split('\n'))  # Count grades

预期输出:

A = 2

B = 2

C = 1

实际输出:

计数器({'等级':1})

计数器({'A':1})

计数器({'A':1})

计数器({'B':1})

计数器({'C':1})

计数器({'B':1})

由于每个等级都显示在不同的列表中,我无法合并/连接列表以获得总数。它也不是所需的输出格式。

4

2 回答 2

0

您可以从实例化 a 开始Counter,然后在迭代时为其添加成绩:

grades_counter = Counter()
mysheet = xlrd.open_workbook('grades.xls').sheet_by_index(0)

for i in range(1,mysheet.nrows):
    grades_counter += Counter(str(mysheet.row_values(i)[2]))

print grades_counter
Counter({'A': 2, 'B': 2, 'C': 1})

如果您希望以更优雅的方式打印输出,可以执行以下操作:

for k,v in grades_counter.items():
    print "{} = {}".format(k,v)

你应该得到:

A = 2
C = 1
B = 2

我希望这有帮助。

于 2016-08-18T13:48:21.117 回答
0
for rownum in range(sh.nrows):
    grades = str(sh.cell(rownum, 2).value) # Grab all variables in column 2.
    print Counter(grades.split('\n'))  # Count grades

您正在每次迭代中创建一个列表。

您可以使用列表推导来创建一个包含所有成绩的列表:

grades = [str(sh.cell(rownum, 2).value) for rownum in range(sh.nrows)]
print Counter(grades)

或者没有理解:

grades = []
for rownum in range(sh.nrows):
    grades.append(str(sh.cell(rownum, 2).value))

print Counter(grades)

您仍然需要根据Counter(grades)自己的喜好格式化内容:

res = Counter(grades)
for grade, count in res.iteritems():
    print '{} = {}'.format(grade, count) 

注意:

  1. 我没有使用split.

  2. 输出不会按任何特定顺序排列,实际上可能会在脚本的连续运行之间发生变化。

于 2016-08-18T13:37:20.427 回答