我是Python的新手,我正在创建一个程序来跟踪学区里学生使用的RFID徽章。在我的程序中,我有一个名为Badge
的类,它创建一个带有六个公共命名变量的徽章对象(RFID,studentID,status,dateActivated,dateDeactivated,reason)。然后我有一个名为BadgeTable
的班级,上面有徽章。
我想要做的是查看任何徽章中是否存在特定的RFID或学生ID。我知道我可以用循环来做到这一点,但这可能需要一段时间(我在大约450个CSV文件中读取,每个文件包含2000到14000个徽章,并且只有在没有'时才向BadgeTable添加徽章。已添加)。
编辑:要扩展上述内容,过去三年的所有徽章数据都已手动输入到电子表格中,该电子表格具有识别重复RFID或学生ID号码的逻辑,然后每天导出为徽章阅读器软件的CSV文件。对于我们的巴士徽章计划的第一年,每天的CSV文件仅包含有效徽章;我们天真地认为,如果我们停止发送非活动徽章,他们将被徽章阅读器拒绝。当我们发现错误时,我们开始在CSV文件中包含我们知道的非活动徽章(我们为每个非活动徽章的studentID添加了一个后缀以保持其唯一性),因此从那时起每天的CSV文件是前一天文件的超集。但是,当前的CSV文件中不存在无关紧要的非活动/丢失徽章数量,因此上述过程旨在使用旧的CSV文件a)尽可能完整地列出我们的徽章列表。已发布,以及b)消除与每个徽章相关的学生姓名中的拼写错误。
我希望能说出类似的话:
studentBadges = BadgeTable()
#
# Bunch of code to load badges into studentBadges
#
if RFID not in studentBadges[:].RFID:
studentBadges.add_badge(RFID, studentID, 'A', fileDate, None, None)
我想要做的是查看变量RFID是否与studentBadges中的任何徽章中的RFID字段匹配。我已尝试过,studentBadges[:][1]
,但都失败了(都是'BadgeTable' object is not subscriptable
)
我目前的解决方法是在名为RFIDList
的BadgeTable类中实际存储一个单独的列表,当每个徽章添加到BadgeTable
时,我还将它的RFID值添加到{{1 }}。只要我从未对RFIDList
或徽章列表进行排序,我就可以执行以下操作:
RFIDList
是否有一种更优雅,更Pythonic的方法来测试Python 3中复合对象中是否存在值,这种方法并不涉及在类中保留并行列表?
答案 0 :(得分:4)
我不太清楚为什么你需要BadgeTable
成为一个班级,而不仅仅是让studentBadges
成为Badge
Badge
个。它只是保存数据吗?
无论如何,看看python在列表之外提供的内容是有意义的。您似乎关心Badge
s的唯一性,而不关心它们的顺序。列表(类似于其他编程语言中的“数组”)都与订单有关。 collection和Sets(其他语言中的“关联数组”或“哈希映射”)是无序的,但可以帮助您获得唯一性:
所以你可以有两个词典,一个将RFID映射到Badge
,一个映射学生ID到Badge
。在这些中查找比在列表中查找要快得多。
但更好的方法可能只是在一组Badge
中。试图再次添加Badge
将无能为力。持有(数学)一组唯一对象正是(python)集所做的。
但两个物体什么时候“相同”?默认情况下,Badge
等用户定义类的实例为dictionaries,但除了自身之外,还要比较不等。因此,您从读入数据中新近创建的每个RFID
将被视为与其他所有人不同,即使有些人共享其studentID
或__hash__()
。因此,在__eq__()
中覆盖方法Badge
和Badge
,以便RFID
在a == b
匹配时比较相等。
平等应该是可传递的。 (即,如果b == c
和a == c
,那么Badge
。)因此,如果RFID
s 和studientID
s ,您可以使RFID
比较相等他们的studientID
匹配,但如果他们的__hash__()
或他们的{{1}}匹配,则不应该使它们相等。 (无论如何,找不到符合后者的有意义的{{1}}实现是不可能的。)
虽然我猜如果学生在他或她的学校生涯中获得了几张徽章(使用不同的RFID),但无论如何,你的程序可能想要了解的不仅仅是第一张徽章。
查看您在此处理的数据量,您确定要(并且可以)将其全部保存在内存中吗?如果没有,使用python访问您选择的数据库管理系统可能是要走的路。关系数据库还支持您想要依赖的集合操作语义。