たぶん、このような何かがあなたを始めさせるでしょうか?
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
と呼ばれるオブジェクトを提供します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
して、アレイの構築をもう少しコンパクトにすることもできますが、1 ~ 2 行しかないので、手動で行うのと同じくらい簡単だと思いました。