您需要使用名称作为键并附加行的切片作为值,使用普通或默认字典将没有顺序:
import csv
from collections import defaultdict
with open('in.csv') as f:
r = csv.reader(f)
d = defaultdict(list)
for row in r:
d[row[0]].append(row[1:])
print(d)
如果您想维持秩序,您需要OrderedDict:
from collections import OrderedDict
with open('in.csv') as f:
r = csv.reader(f)
od = OrderedDict()
for row in r:
# get key/ first element in row
key = row[0]
# create key/list paring if it does not exist, else just append the value
od.setdefault(key, []).append(row[1:])
print(od)
输出:
OrderedDict([('Name_1', [['2', 'K', '14'], ['3', 'T', '14'], ['4', 'T', '18']]), ('Name_2', [['2', 'G', '12'], ['4', 'T', '14'], ['6', 'K', '15']]), ('Name_3', [['2', 'K', '12'], ['3', 'T', '15'], ['4', 'G', '18']])])
如果名称被分组,您也可以使用 groupby,这将根据每行中的第一个项目/名称对元素进行分组:
import csv
from collections import OrderedDict
from itertools import groupby
from operator import itemgetter
with open('in.csv') as f:
r = csv.reader(f)
od = OrderedDict()
for k, v in groupby(r, key=itemgetter(0)):
od[k] = [sub[1:] for sub in v]
如果你使用python3,你可以使用*解包:
with open("in.csv") as f:
r = csv.reader(f)
od = OrderedDict()
for row in r:
key, *rest = row
od.setdefault(key, []).append(rest)
import csv
from collections import OrderedDict
from itertools import groupby
from operator import itemgetter
with open('in.csv') as f:
r = csv.reader(f)
od = OrderedDict()
for k, v in groupby(r, key=itemgetter(0)):
od[k] = [sub for _, *sub in v]
print(od)