如何使用字典来收集每个人的主题:
from collections import defaultdict
subjects = defaultdict(list)
for record in data_list:
subjects[record[0]].append(record[1])
# subjects
defaultdict(list,
{'John': ['Physics', 'PC', 'Math'],
'Mary': ['Physics', 'PC', 'Algebra'],
'Helen': ['Physics', 'PC', 'Algebra', 'Analysis'],
'Bill': ['PC', 'Analysis', 'Math', 'Biology'],
'Michael': ['Analysis']})
然后可以将其转换为列表列表:
subjects_list = [[x] + y for x, y in subjects.items()]
# subjects_list
[['John', 'Physics', 'PC', 'Math'],
['Mary', 'Physics', 'PC', 'Algebra'],
['Helen', 'Physics', 'PC', 'Algebra', 'Analysis'],
['Bill', 'PC', 'Analysis', 'Math', 'Biology'],
['Michael', 'Analysis']]
编辑根据 OP 的要求,这是一个仅使用列表的解决方案:
subject_list = [] # output
persons = [] # track unique persons
for record in data_list:
if record[0] not in persons:
persons.append(record[0]) # Track new person
subject_list.append([record[0]]) # Add new person to output
subject_list[-1].append(record[1]) # Add subject for person
else:
subject_list[persons.index(record[0])].append(record[1])
# subject_list
[['John', 'Physics', 'PC', 'Math'],
['Mary', 'Physics', 'PC', 'Algebra'],
['Helen', 'Physics', 'PC', 'Algebra', 'Analysis'],
['Bill', 'PC', 'Analysis', 'Math', 'Biology'],
['Michael', 'Analysis']]
EDIT 2 您可以推广这种方法,通过任何索引(例如人,...)过滤掉一个 类别 em>(例如学科、年级、...)
def groupby(data, index, category):
"""Sort list of records by index and category
"""
output = []
indices = []
for record in data:
if record[index] not in indices:
indices.append(record[index])
output.append([record[index]])
output[-1].append(record[category])
else:
output[indices.index(record[index])].append(record[category])
return output
这将允许您像这样列出每个人的主题:
# index 0 -> person
# category 1 -> subject
subject_list = groupby(data_list, 0, 1)
或者你可以这样列出每个人的成绩:
# index 0 -> person
# category 2 -> grade
grade_list = groupby(data_list, 0, 2)
# grad_list
[['John', 5, 7, 8],
['Mary', 6, 10, 7],
['Helen', 7, 6, 8, 10],
['Bill', 10, 6, 8, 6],
['Michael', 10]]
然后您可以像这样获得每人所学科目的数量或平均成绩:
import statistics
subjects_taken = [len(x) - 1 for x in subject_list]
average_grade = [statistics.mean(x[1:]) for x in grade_list]
把所有东西放在一起给你:
persons = [x[0] for x in subject_list]
final_list = list(zip(persons, subjects_taken, average_grade))
# final_list
[('John', 3, 6.666666666666667),
('Mary', 3, 7.666666666666667),
('Helen', 4, 7.75),
('Bill', 4, 7.5),
('Michael', 1, 10)]