首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >搜索复合对象中的字段

搜索复合对象中的字段
EN

Stack Overflow用户
提问于 2015-04-10 22:58:20
回答 1查看 87关注 0票数 2

我对Python相当陌生,并且正在创建一个程序来跟踪我学区学生使用的RFID徽章。在我的程序中,我有一个名为Badge的类,它使用六个公共变量(RFID、studentID、status、dateActivated、dateDeactivated、reason)创建一个徽章对象。然后,我有一个名为BadgeTable的类,它持有徽章。

我想做的是看看是否有一个特定的射频识别或studentID存在于任何徽章。我知道我可以用循环来完成这个任务,但这可能需要一段时间(我正在阅读大约450个CSV文件,每个文件都包含2000到14000个徽章,并且只有在尚未添加的情况下才向BadgeTable添加一个徽章)。

编辑:为了扩展上面的内容,过去三年的所有徽章数据都被手工输入到一个电子表格中,该电子表格具有识别重复的射频识别或studentID号码的逻辑,然后作为徽章阅读器软件的CSV文件每天输出。在我们的公共汽车徽章项目的第一年,每天的CSV文件只包含活动徽章;我们天真地认为,如果我们停止发送不活动的徽章,它们将被徽章阅读器拒绝。当我们发现我们错了时,我们开始在CSV文件中包括我们所知道的不活动标记(我们为每个不活动的徽章添加了一个后缀,以保持它们的惟一性),因此从那时起,每一天的CSV文件都是前一天文件的超集。然而,在当前的CSV文件中没有一个不活动的/丢失的徽章,因此上面的过程是一种使用旧CSV文件的方法:(尽可能完整地列出我们颁发的徽章列表;b)消除与每个徽章相关的学生姓名中的拼写错误。

我希望能说出这样的话:

代码语言:javascript
复制
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或徽章列表本身进行排序,我就可以这样做:

代码语言:javascript
复制
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中的复合对象中是否存在一个值,这种方法不需要在类中保留并行列表?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-04-11 00:10:17

我不太清楚为什么需要BadgeTable作为类,而不是让studentBadges成为Badge集合

在任何情况下,查看python在列表之外必须提供的集合是有意义的。您似乎关心Badge的唯一性,但不关心它们的顺序。列表(类似于其他编程语言中的“数组”)都是关于顺序的。集合字典 (其他语言中的“关联数组”或“散列映射”)是无序的,但是可以帮助您获得唯一性:

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

因此您可以有两个字典,一个将RFID映射到Badge,另一个将学生in映射到Badge,查找这些字典比在列表中查找要快得多。

但更好的办法可能是将Badge放在一个集合中。第二次尝试添加一个Badge将一无所获。持有一组(数学的)唯一对象正是(python)集所做的事情。

但是什么时候两个物体是“相同的”呢?像Badge这样的用户定义类的实例在默认情况下是哈斯德,但是比较不平等,除了它们本身。因此,您从读取数据中新建的每个Badge都会被认为与其他所有Badge不同,即使有些人共享它的RFIDstudentID。因此,重写__hash__()__eq__()Badge中的方法,以便Badge比较相等当且仅当它们的RFID匹配。

Nota bene:等式一致性

平等应该是过渡性的。(即,如果是a == bb == c,那么也是a == c.)因此,您可以使Badge比较相等(如果两者都相同),使它们的RFIDs 成为studientID的匹配,但不应该使它们已经相等(如果有的话),使它们的RFIDs 成为studientID的匹配。(无论如何,不可能找到与后者一致的有意义的__hash__()实现。)

尽管我想如果一个学生在他或她的学校生涯中得到了几个徽章(带有不同的RFID),你的项目可能想知道的不仅仅是第一个徽章。

6'300'000枚徽章

看看您在这里处理的数据量,您确定要(并且能够)将其全部保存在内存中吗?如果不是,那么使用python访问您选择的数据库管理系统可能是可行的。关系数据库还支持您想要依赖的set操作语义。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29571926

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档