Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/353.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在Python中按类别对学生记录列表进行排序_Python_List_Nested_Names - Fatal编程技术网

如何在Python中按类别对学生记录列表进行排序

如何在Python中按类别对学生记录列表进行排序,python,list,nested,names,Python,List,Nested,Names,假设我有这样的嵌套列表 #学生记录 数据列表=[#个人、科目、年级 [“约翰”,“物理”,5],“约翰”,“个人电脑”,7],“约翰”,“数学”,8], [“玛丽”,“物理学”,6],“玛丽”,“个人电脑”,10],“玛丽”,“代数”,7], [“海伦”,“物理学”,7],“海伦”,“个人电脑”,6],“海伦”,“代数”,8], [“海伦”,“分析”,10],“比尔”,“个人电脑”,10],“比尔”,“分析”,6], [“比尔”,“数学”,8],“比尔”,“生物学”,6],“迈克尔”,“分析”,

假设我有这样的嵌套列表

#学生记录
数据列表=[#个人、科目、年级
[“约翰”,“物理”,5],“约翰”,“个人电脑”,7],“约翰”,“数学”,8],
[“玛丽”,“物理学”,6],“玛丽”,“个人电脑”,10],“玛丽”,“代数”,7],
[“海伦”,“物理学”,7],“海伦”,“个人电脑”,6],“海伦”,“代数”,8],
[“海伦”,“分析”,10],“比尔”,“个人电脑”,10],“比尔”,“分析”,6],
[“比尔”,“数学”,8],“比尔”,“生物学”,6],“迈克尔”,“分析”,10]
]
我如何创建一个代码来打印每个学生都参加了什么课程?代码输出应如下所示:

#个人拍摄的主题
[[“约翰”、“物理”、“电脑”、“数学”],
[“玛丽”、“物理学”、“个人电脑”、“代数”],
...]

我更喜欢只使用Python列表的解决方案。

如何使用字典收集每个人的主题:

从集合导入defaultdict
主题=defaultdict(列表)
对于数据列表中的记录:
主题[记录[0]]。追加(记录[1])
#主题
defaultdict(列表,
{'John':['Physics'、'PC'、'Math'],
“玛丽”:[“物理学”、“计算机”、“代数”],
海伦:[“物理学”、“计算机”、“代数”、“分析”],
‘比尔’:[‘个人电脑’、‘分析’、‘数学’、‘生物学’],
“迈克尔”:[“分析”]})
然后可以将其转换为列表列表:

subjects\u list=[[x]+y代表x,y代表subjects.items()]
#主题列表
约翰、物理、电脑、数学、,
['Mary'、'Physics'、'PC'、'代数'],
['Helen'、'Physical'、'PC'、'Algebra'、'Analysis'],
['Bill','PC','Analysis','Math','Biology'],
['Michael','Analysis']]
根据OP的要求编辑,以下是仅使用列表的解决方案:

subject_list=[]输出
人员=[]#跟踪唯一的人员
对于数据列表中的记录:
如果记录[0]不是个人记录:
persons.append(记录[0])#跟踪新人员
subject_list.append([record[0]])#向输出添加新人员
主题列表[-1]。追加(记录[1])#为个人添加主题
其他:
主题列表[persons.index(记录[0])]。追加(记录[1])
#主题列表
约翰、物理、电脑、数学、,
['Mary'、'Physics'、'PC'、'代数'],
['Helen'、'Physical'、'PC'、'Algebra'、'Analysis'],
['Bill','PC','Analysis','Math','Biology'],
['Michael','Analysis']]
编辑2您可以推广此方法,通过筛选出类别(如科目、年级等)的任何索引(如人员等)对
数据列表进行排序

def groupby(数据、索引、类别):
“”“按索引和类别对记录列表进行排序
"""
输出=[]
指数=[]
对于数据中的记录:
如果记录[索引]不在索引中:
index.append(记录[索引])
output.append([记录[索引]])
输出[-1]。追加(记录[类别])
其他:
输出[index.index(记录[index])].append(记录[category])
返回输出
这将允许您列出每个人的主题,如下所示:

#索引0->person
#类别1->主题
主题列表=分组依据(数据列表,0,1)
或者你可以像下面这样列出每个人的分数:

#索引0->person
#第2类->等级
等级列表=分组依据(数据列表,0,2)
#梯度列表
约翰,5,7,8,
[Mary',6,10,7],
[Helen',7,6,8,10],
[Bill',10,6,8,6],
['Michael',10]]
然后,您可以获得每个人的科目数或平均分数,如下所示:

导入统计信息
受试者人数=[len(x)-1代表受试者名单中的x]
平均成绩=[统计。成绩表中x的平均值(x[1:])]
把所有的东西放在一起会让你:

persons=[x[0]代表主题列表中的x]
最终名单=名单(zip(人员、受试者、平均成绩))
#最终清单
[(“约翰”,3,6.667),
(《玛丽》,3,7.667),
(《海伦》,4,7.75),
(《条例草案》,第4、7.5条),
('Michael',1,10)]

您可以尝试以下功能:

def consolidate(data):
    # list of names from  data_list
    names = list(set([i[0] for i in data])) 
    consolidated = [] # empty list to get the sublists

    # Looping for each name
    for name in names:
        subList = [name] # sublist for each name
        for i in data: # loop for each item within data_list
            if i[0] == name: # if name is the same, append the subject
                subList.append(i[1])
        consolidated.append(subList) # append sublists in consolidated list
    return consolidated
调用函数:

consolidate(data_list)
输出:

[['Mary', 'Physics', 'PC', 'Algebra'], ['Helen', 'Physics', 'PC', 'Algebra', 'Analysis'],
['John', 'Physics', 'PC', 'Math'], ['Bill', 'PC', 'Analysis', 'Math', 'Biology'],
['Michael', 'Analysis']]

它需要代码仅从数据列表中获取数据并仅使用lists@Nontas代码仅使用数据列表中的数据。我添加了一个只使用列表的解决方案,尽管您确实应该尽可能利用其他Python容器类型。非常感谢!我也要试试字典的解答。我写的代码与你的代码非常相似,但在主题列表中,我将0而不是-1。我如何才能得到每个名称的结果,以及课程数量和总平均数?它应该是这样的[[John',3,6.67],…]@Nontas我怀疑如果你将主题添加到
主题列表[0]
(第一个找到的人)而不是
主题列表[-1]
(最后一个找到的人),你是否会得到正确的结果。