您可以创建一个字典,其中包含每个学生所参加的课程:
>>> import csv
>>> import collections
>>> D = collections.defaultdict(set)
>>> with open('subjects.csv','rb') as f:
... subject_reader = csv.reader(f)
... header = subject_reader.next()
... for row in subject_reader:
... for name in row[1:]:
... D[name].add(row[0])
...
>>> import pprint
>>> pprint.pprint(dict(D))
{'Bob': set(['Physics']),
'Joe': set(['Maths']),
'Megan': set(['Biology']),
'Rob': set(['Chemistry']),
'Sam': set(['Biology']),
'Tim': set(['Biology', 'Maths', 'Physics']),
'Tom': set(['Chemistry']),
'Will': set(['Chemistry', 'Maths', 'Physics'])}
>>>
要检查人们一起上多少课,你可以使用 set 的交集方法:
>>> D['Tom'].intersection(D['Will'])
set(['Chemistry'])
>>> len(_)
1
>>> D['Tim'].intersection(D['Will'])
set(['Maths', 'Physics'])
>>> len(_)
2
>>>
要打印示例中的表格,您可以执行以下操作:
>>> EXAMPLE_NAMES = ['Tom','Tim','Will']
>>> for y_name in EXAMPLE_NAMES:
... print '{0:{width}}'.format(y_name,width=5),
... for x_name in EXAMPLE_NAMES:
... if y_name==x_name:
... print '{0:{width}}'.format('-'*5, width=5),
... else:
... print '{0:{width}}'.format(len(D[y_name].intersection(D[x_name])), width=5),
... print
...
Tom ----- 0 1
Tim 0 ----- 2
Will 1 2 -----
表格的标题可能如下所示:
>>> for x_name in [' ']+EXAMPLE_NAMES:
... print '{0:{width}}'.format(x_name, width=5),
...
Tom Tim Will
正如约翰在 cmets 中提到的,我将名称硬编码到一个列表中,以模仿您上面给出的示例。要查看整个表,您可以从使用 .iterkeys() 或 .keys() 创建的字典中获取或迭代键:
>>> import csv
>>> import collections
>>>
>>> my_d = collections.defaultdict(set)
>>> with open('subjects.csv','rb') as f:
... subject_reader = csv.reader(f)
... header = subject_reader.next()
... for row in subject_reader:
... for name in row[1:]:
... my_d[name].add(row[0])
...
>>> def display_header(D):
... for x_name in [' ']+D.keys():
... print '{0:{width}}'.format(x_name, width=5),
... print
...
>>> def display_body(D):
... for y_name in D.iterkeys():
... print '{0:{width}}'.format(y_name,width=5),
... for x_name in D.iterkeys():
... if y_name==x_name:
... print '{0:{width}}'.format('-'*5, width=5),
... else:
... print '{0:{width}}'.format(len(D[y_name].intersection(D[x_name])), width=5),
... print
...
>>> def display_table(D):
... display_header(D)
... display_body(D)
...
>>> display_table(my_d)
Sam Rob Megan Will Tim Joe Tom Bob
Sam ----- 0 1 0 1 0 0 0
Rob 0 ----- 0 1 0 0 1 0
Megan 1 0 ----- 0 1 0 0 0
Will 0 1 0 ----- 2 1 1 1
Tim 1 0 1 2 ----- 1 0 1
Joe 0 0 0 1 1 ----- 0 0
Tom 0 1 0 1 0 0 ----- 0
Bob 0 0 0 1 1 0 0 -----
>>>