python - 如何在 Python 的类中创建列表或集合对象?

标签 python class dictionary

对于我的项目,讲师(定义为类(class))的角色是向学生提供项目。项目本身也是一个类。我有一些全局字典,以映射到对象的讲师和项目的唯一数字 ID 为键。

因此对于“讲师”词典(当前):

lecturer[id] = Lecturer(lec_name, lec_id, max_students)

我当前正在读取从数据库生成的空白分隔文本文件。我无法直接访问数据库,因此我对文件的格式化方式没有太多发言权。这是一个虚构的片段,显示了文本文件的结构。请原谅我的俗气。

0001 001 "Miyamoto, S." "Even Newer Super Mario Bros"
0002 001 "Miyamoto, S." "Legend of Zelda: Skies of Hyrule"
0003 002 "Molyneux, P." "Project Milo"
0004 002 "Molyneux, P." "Fable III"
0005 003 "Blow, J." "Ponytail"

每行的结构基本上是proj_id, lec_id, lec_name, proj_name

现在,我正在将相关数据读入相关对象中。因此,proj_id 存储在class Project 中,而lec_name 是一个class Lecturer 对象,等等。 LecturerProject 类当前不相关。

但是,当我从文本文件中读取每一行时,对于该行,我希望将讲师提供的项目读入 Lecturer 类;我已经将 proj_id 读入 Project 类中。我想在 Lecturer 中创建一个名为 offered_proj 的对象,它应该是该讲师提供的项目的集合或列表。因此,每当我在同一行中读取同一 lec_id 下的新项目时,offered_proj 将随该项目进行更新。如果我想显示讲师提供的项目列表,我理想情况下只想使用 print讲师[lec_id].offered_proj

我的 Python 不太好,如果有人能告诉我一种方法,我将不胜感激。我不确定它作为一个集合还是一个列表是否更好。

更新

根据Alex Martelli的建议和 Oddthinking我回去做了一些更改并尝试打印结果。

这是代码片段:

for line in csv_file:
    proj_id = int(line[0])
    lec_id = int(line[1])
    lec_name = line[2]
    proj_name = line[3]
    projects[proj_id] = Project(proj_id, proj_name)
    lecturers[lec_id] = Lecturer(lec_id, lec_name)
    if lec_id in lecturers.keys():
        lecturers[lec_id].offered_proj.add(proj_id)
    print lec_id, lecturers[lec_id].offered_proj

print讲师[lec_id].offered_proj行打印以下输出:

001 set([0001])
001 set([0002])
002 set([0003])
002 set([0004])
003 set([0005])

基本上感觉就像这个集合被覆盖了或者类似的东西。因此,如果我尝试打印特定讲师 print lec_id,讲师[001].offered_proj,我得到的只是最后读入的 proj_id

最佳答案

set更好,因为您不关心顺序并且没有重复。

您可以使用 csv 轻松解析该文件模块(delimiter' ' )。

一旦您拥有lec_name你必须检查那位讲师是否已经知道;为此,请保留一本字典 lec_name讲师对象(这只是对同一讲师对象的另一个引用,您也从lecturer字典中引用了该对象)。找到lec_name不在该字典中,您知道它是以前未见过的讲师,因此仅在这种情况下创建一个新的讲师对象(并将其粘贴在两个字典中),并提供一组空的类(class)。最后,只是.add类(class)当前讲师的offered_proj 。这确实是一个非常流畅的流程。

您是否尝试过实现此流程?如果是这样,您遇到了什么问题?你能给我们看一下相关的代码吗——最多应该有十几行左右?

编辑:由于OP现在已经发布了代码,我可以发现错误——它在这里:

lecturers[lec_id] = Lecturer(lec_id, lec_name)
if lec_id in lecturers.keys():
    lecturers[lec_id].offered_proj.add(proj_id)

这是无条件创建一个新的讲师对象(践踏 lecturers 字典中的旧对象,如果有的话),所以当然前一组会被丢弃。这是您需要的代码:首先检查,仅在需要时创建! (另外,小错误,不要检查 in....keys() ,效率非常低 - 只需检查字典中是否存在)。如下:

if lec_id in lecturers:
    thelec = lecturers[lec_id]
else:
    thelec = lecturers[lec_id] = Lecturer(lec_id, lec_name)
thelec.offered_proj.add(proj_id)

你可以用几种不同的方式来表达这一点,但我希望这足够清楚。为了完整起见,我通常的表达方式(以避免两次查找字典)如下:

thelec = lecturers.get(lec_id)
if thelec is None:
    thelec = lecturers[lec_id] = Lecturer(lec_id, lec_name)
thelec.offered_proj.add(proj_id)

关于python - 如何在 Python 的类中创建列表或集合对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2293968/

相关文章:

java - 数组列表中丢失数据

python - 包含 pandas 数据框的数组和矩阵的字典列表

ios - 如何保存 Swift 字典结构?

python - 是否有Python3内置用于格式化表示多项式首项系数的字符串?

python - NDB 数据存储。如何区分默认值和未设置的值

python - 根据对角线值选择子矩阵

python - 在同一类的不同实例之间实现逻辑

java - 接口(interface)类型的多态数组的有效成员

c++ - STL 少运算符和 "invalid operator<"错误

python - 使用 ctypes 从 C++ 函数返回字符串给出大的 int,而不是 char 指针