您的 csv 似乎已经排序。如果是这种情况,您可以使用itertools.groupby 来抓取按第一列分组的元素:
import csv
from itertools import combinations, groupby
from operator import itemgetter
with open('myfile.csv') as fh:
# skip header
_ = next(fh)
reader = csv.reader(fh)
# itemgetter(0) will grab the first element as the grouping key
for k, v in groupby(reader, key=itemgetter(0)):
chunk = [item[1] for item in v]
group = list(combinations(chunk, 2))
print(k, group)
C1 [('S1 ', 'S2 '), ('S1 ', 'S3 '), ('S2 ', 'S3 ')]
C2 [('S1 ', 'S2 '), ('S1 ', 'S4 '), ('S1 ', 'S5'), ('S2 ', 'S4 '), ('S2 ', 'S5'), ('S4 ', 'S5')]
如果它未排序,您仍然可以这样做,但使用defaultdict 来保存您的条目:
from collections import defaultdict
from itertools import groupby, combinations
from operator import itemgetter
import csv
groups = defaultdict(list)
with open('myfile.csv') as fh:
# skip header
_ = next(fh)
reader = csv.reader(fh)
# itemgetter(0) will grab the first element as the grouping key
for k, v in groupby(reader, key=itemgetter(0)):
chunk = [item[1] for item in v]
group = list(combinations(chunk, 2))
groups[k].extend(group)
defaultdict(<class 'list'>, {'C1': [('S1 ', 'S2 '), ('S1 ', 'S3 '), ('S2 ', 'S3 ')], 'C2': [('S1 ', 'S2 '), ('S1 ', 'S4 '), ('S1 ', 'S5'), ('S2 ', 'S4 '), ('S2 ', 'S5'), ('S4 ', 'S5')]})