对于我的项目,讲师(定义为类(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
对象,等等。 Lecturer
和 Project
类当前不相关。
但是,当我从文本文件中读取每一行时,对于该行,我希望将讲师提供的项目读入 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/