也许这样的事情会让你开始?
import csv
import collections
import itertools
grid = collections.Counter()
with open("connect.csv", "r", newline="") as fp:
reader = csv.reader(fp)
for line in reader:
# clean empty names
line = [name.strip() for name in line if name.strip()]
# count single works
if len(line) == 1:
grid[line[0], line[0]] += 1
# do pairwise counts
for pair in itertools.combinations(line, 2):
grid[pair] += 1
grid[pair[::-1]] += 1
actors = sorted(set(pair[0] for pair in grid))
with open("connection_grid.csv", "w", newline="") as fp:
writer = csv.writer(fp)
writer.writerow([''] + actors)
for actor in actors:
line = [actor,] + [grid[actor, other] for other in actors]
writer.writerow(line)
[编辑:修改为在 Python 3.2 下工作]
关键模块是 (1) csv
,这使得读取和写入 csv 文件变得更加简单;(2) collections
,它提供了一个名为 a 的对象Counter
-- 就像 a defaultdict(int)
,如果你的 Python 没有,你可以使用Counter
它,它是一个自动生成默认值的字典,所以你不必这样做,这里的默认计数是 0 ; 和 (3) itertools
,它具有combinations
获取所有对的功能。
产生
,A,B,C,D,E,F,X
A,1,2,1,1,0,0,1
B,2,1,3,1,2,1,0
C,1,3,0,1,2,2,1
D,1,1,1,0,0,3,1
E,0,2,2,0,0,0,0
F,0,1,2,3,0,1,1
X,1,0,1,1,0,1,0
您可以使用它itertools.product
来使构建阵列更加紧凑,但由于它只有一两行,我认为手动完成它很简单。