在python中,对于“n到n”关系,您将使用什么?

2024-04-23 15:07:28 发布

您现在位置:Python中文网/ 问答频道 /正文

在对字典进行了fiddling之后,我得出了一个结论,即我需要一个能够进行n to n查找的数据结构。一个例子是:一个课程可以由几个学生访问,每个学生可以访问多个课程。在

什么是最具Python式的方法来达到这个目的?这不会超过500名学生和100门课程,以保持这个例子。所以我想避免使用真正的数据库软件。在

谢谢!在


Tags: to方法目的数据库数据结构字典软件学生
3条回答

这完全取决于您希望结构能够快速执行的操作。在

如果您希望能够快速查找与课程和学生相关的属性,例如,一个学生在某一特定课程的学习上花费了多少小时,或者该学生完成了该课程的成绩,如果他已经完成了该课程等,那么您可能需要一个包含n*m元素的向量,其中n是学生人数,m是课程数。在

另一方面,如果一个学生所学的平均课程数远远少于课程总数(在实际案例中可能是这样),并且您希望能够快速查找学生所学的所有课程,那么您可能需要使用一个由n个列表组成的数组,可以是链接列表、可调整大小的向量或类似–取决于您是否希望能够使用列表;可能是快速删除列表中间的元素,或者快速访问随机位置的元素。如果您都希望能够快速删除列表中间的元素并快速随机访问列表元素,那么可能某种树结构最适合您。在

大多数树数据结构对树中元素的数量以对数时间执行所有基本操作。请注意,某些树数据结构在这些运算符上的摊余时间与树中的元素数成线性关系,即使随机构造的树的平均时间是对数的。发生这种情况的一个典型例子是,如果使用二进制搜索树并用越来越大的元素来构建它。不要这样做;在这种情况下,在使用元素构建树之前,先对元素进行置乱,或者使用分而治之的方法将列表拆分为两部分和一个pivot元素,并使用pivot元素创建树根,然后递归地从列表的左半部分和右部分创建树,这些树也使用分而治之的方法,并将它们分别作为左子项和右子项附加到根上。在

很抱歉,我不懂python,所以我不知道是什么数据结构是语言的一部分,您必须自己创建。在

因为你的工作集很小,所以我认为把学生ID作为列表存储在课程类中不是问题。在一个班里找到学生就很简单了

course.studentIDs

要查找学生所在的课程,只需迭代这些课程并找到ID:

^{pr2}$

你还有其他方法可以做到。你可以有一个studentId字典映射到courseIDs,或者有两个字典-一个映射到s都铎王朝:courseIDs和另一个课程:学生-更新后,互相更新。在

我为之编写代码的实现可能是最慢的,这就是为什么我提到您的工作集足够小,所以不会有问题。我提到但没有显示代码的其他实现将需要更多的代码来使它们工作,但这些代码并不值得这样做。在

我想你想索引学生和课程。否则,您可以轻松地创建一个元组列表来存储所有学生、课程组合:[(St1,Crs1),(St1,Crs2)。。(St2,Crs1)。。。(Sti、Crsi)。。。]然后每次你需要的时候做一个线性查找。对500多个学生来说,这也不错。在

但是,如果您想快速查找任何一种方法,都没有内置的数据结构。您可以简单地使用两个字典:

courses = { crs1: [ st1, st2, st3 ], crs2: [ st_i, st_j, st_k] ... } 
students = { st1: [ crs1, crs2, crs3 ], st2: [ crs_i, crs_j, crs_k] ... } 

对于给定的学生,查找课程现在是学生;而对于给定的课程c,查找学生就是课程[c]。在

相关问题 更多 >