在复合对象中搜索字段

时间:2015-04-10 22:58:20

标签: python python-3.x

我是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中复合对象中是否存在值,这种方法并不涉及在类中保留并行列表?

1 个答案:

答案 0 :(得分:4)

我不太清楚为什么你需要BadgeTable成为一个班级,而不仅仅是让studentBadges成为Badge Badge个。它只是保存数据吗?

无论如何,看看python在列表之外提供的内容是有意义的。您似乎关心Badge s的唯一性,而不关心它们的顺序。列表(类似于其他编程语言中的“数组”)都与订单有关。 collectionSets(其他语言中的“关联数组”或“哈希映射”)是无序的,但可以帮助您获得唯一性:

  • 集合最多包含一次对象
  • 字典最多包含一次关键对象。每个键都指向一个值对象。 (几个键可能指向相同的值。)

所以你可以有两个词典,一个将RFID映射到Badge,一个映射学生ID到Badge。在这些中查找比在列表中查找要快得多。

但更好的方法可能只是在一组Badge中。试图再次添加Badge将无能为力。持有(数学)一组唯一对象正是(python)集所做的。

但两个物体什么时候“相同”?默认情况下,Badge等用户定义类的实例为dictionaries,但除了自身之外,还要比较不等。因此,您从读入数据中新近创建的每个RFID将被视为与其他所有人不同,即使有些人共享其studentID__hash__()。因此,在__eq__()中覆盖方法BadgeBadge,以便RFIDa == b匹配时比较相等。

Nota bene:平等一致性

平等应该是可传递的。 (即,如果b == ca == c,那么Badge。)因此,如果RFID s studientID s ,您可以使RFID比较相等他们的studientID匹配,但如果他们的__hash__() 他们的{{1}}匹配,则不应该使它们相等。 (无论如何,找不到符合后者的有意义的{{1}}实现是不可能的。)

虽然我猜如果学生在他或她的学校生涯中获得了几张徽章(使用不同的RFID),但无论如何,你的程序可能想要了解的不仅仅是第一张徽章。

6'300'000徽章

查看您在此处理的数据量,您确定要(并且可以)将其全部保存在内存中吗?如果没有,使用python访问您选择的数据库管理系统可能是要走的路。关系数据库还支持您想要依赖的集合操作语义。