我对Python相当陌生,并且正在创建一个程序来跟踪我学区学生使用的RFID徽章。在我的程序中,我有一个名为Badge的类,它使用六个公共变量(RFID、studentID、status、dateActivated、dateDeactivated、reason)创建一个徽章对象。然后,我有一个名为BadgeTable的类,它持有徽章。
我想做的是看看是否有一个特定的射频识别或studentID存在于任何徽章。我知道我可以用循环来完成这个任务,但这可能需要一段时间(我正在阅读大约450个CSV文件,每个文件都包含2000到14000个徽章,并且只有在尚未添加的情况下才向BadgeTable添加一个徽章)。
编辑:为了扩展上面的内容,过去三年的所有徽章数据都被手工输入到一个电子表格中,该电子表格具有识别重复的射频识别或studentID号码的逻辑,然后作为徽章阅读器软件的CSV文件每天输出。在我们的公共汽车徽章项目的第一年,每天的CSV文件只包含活动徽章;我们天真地认为,如果我们停止发送不活动的徽章,它们将被徽章阅读器拒绝。当我们发现我们错了时,我们开始在CSV文件中包括我们所知道的不活动标记(我们为每个不活动的徽章添加了一个后缀,以保持它们的惟一性),因此从那时起,每一天的CSV文件都是前一天文件的超集。然而,在当前的CSV文件中没有一个不活动的/丢失的徽章,因此上面的过程是一种使用旧CSV文件的方法:(尽可能完整地列出我们颁发的徽章列表;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)
我目前的解决办法是在BadgeTable类中实际存储一个名为RFIDList的单独列表,当每个徽章被添加到BadgeTable中时,我也会将它的RFID值添加到RFIDList中。只要我从不对RFIDList或徽章列表本身进行排序,我就可以这样做:
def delete_badge(self, RFID):
"""Delete an individual badge from BadgeTable """
if RFID in self.RFIDList:
idx = self.RFIDList.index(RFID)
del self.RFIDList[idx]
del self.BadgeTable[idx]有没有一种更优雅、更Python的方法来测试Python 3中的复合对象中是否存在一个值,这种方法不需要在类中保留并行列表?
发布于 2015-04-11 00:10:17
我不太清楚为什么需要BadgeTable作为类,而不是让studentBadges成为Badge的集合。
在任何情况下,查看python在列表之外必须提供的集合是有意义的。您似乎关心Badge的唯一性,但不关心它们的顺序。列表(类似于其他编程语言中的“数组”)都是关于顺序的。集合和字典 (其他语言中的“关联数组”或“散列映射”)是无序的,但是可以帮助您获得唯一性:
因此您可以有两个字典,一个将RFID映射到Badge,另一个将学生in映射到Badge,查找这些字典比在列表中查找要快得多。
但更好的办法可能是将Badge放在一个集合中。第二次尝试添加一个Badge将一无所获。持有一组(数学的)唯一对象正是(python)集所做的事情。
但是什么时候两个物体是“相同的”呢?像Badge这样的用户定义类的实例在默认情况下是哈斯德,但是比较不平等,除了它们本身。因此,您从读取数据中新建的每个Badge都会被认为与其他所有Badge不同,即使有些人共享它的RFID或studentID。因此,重写__hash__()和__eq__()在Badge中的方法,以便Badge比较相等当且仅当它们的RFID匹配。
Nota bene:等式一致性
平等应该是过渡性的。(即,如果是a == b和b == c,那么也是a == c.)因此,您可以使Badge比较相等(如果两者都相同),使它们的RFIDs 和成为studientID的匹配,但不应该使它们已经相等(如果有的话),使它们的RFIDs 或成为studientID的匹配。(无论如何,不可能找到与后者一致的有意义的__hash__()实现。)
尽管我想如果一个学生在他或她的学校生涯中得到了几个徽章(带有不同的RFID),你的项目可能想知道的不仅仅是第一个徽章。
6'300'000枚徽章
看看您在这里处理的数据量,您确定要(并且能够)将其全部保存在内存中吗?如果不是,那么使用python访问您选择的数据库管理系统可能是可行的。关系数据库还支持您想要依赖的set操作语义。
https://stackoverflow.com/questions/29571926
复制相似问题