python - 使用重载方法进行散列

标签 python python-2.7 hash

我有一个 JSON 对象列表(大约 30,000 个),我想从中删除重复项。只要 ModuleCode 相同,我就认为它们是重复的。下面是一个对象的示例。

[{"AveragePoints": "4207", 
"ModuleTitle": "Tool Engineering", 
"Semester": "2", 
"ModuleCode": "ME4261", 
"StudentAcctType": "P", 
"AcadYear": "2013/2014"}]

计划按照 example given here. 进行哈希处理经过一些实验后,我仍然不确定如何正确使用重载方法 __eq____hash__。我是否创建一个新类并在其中包含这两个方法?

下面是我尝试的解决方案。它返回 NameError: name 'obj' is not defined 我怀疑是我对类的错误使用。

import json

json_data = open('small.json')
data = json.load(json_data)

class Module(obj):
    def __eq__(self, other):
        return self.ModuleCode == other.ModuleCode

    def __hash__(self):
        return hash(('ModuleCode', self.ModuleCode))

hashtable = {} #python's dict is implemented as a hashtable

for item in data:
    cur = Module(item)
    if hashtable[hash(cur)] == item.ModuleCode:
        print "duplicate" + item.ModuleCode
    else:
        hashtable[hash(cur)] = item.ModuleCode


json_data.close()

最佳答案

问题是您指的是 obj,而不是 object,它不存在。此外,您实际上并未定义 Module.__init__,因此永远不要初始化 ModuleCode 属性。这是您可以做到的一种方法:

class Module(object):

    def __init__(self, ModuleCode, **data):
        self.ModuleCode = ModuleCode
        self.data = data

    def __eq__(self, other):
        return self.ModuleCode == other.ModuleCode

    def __hash__(self):
        return hash(('ModuleCode', self.ModuleCode))

然后当你创建实例时:

cur = Module(**item)

(如果不熟悉语法,请参阅例如 What does ** (double star) and * (star) do for parameters?)


另外,请注意,您可以使用 set 而不是 dict 来删除重复项;将 ModuleCode 存储为值是重复信息(因为这是实现 __hash____eq__重点):

unique = set()

for item in data:
    cur = Module(**item)
    if cur in unique:
        print "duplicate" + cur.ModuleCode
    else:
        unique.add(cur)

关于python - 使用重载方法进行散列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27530651/

相关文章:

python - 从 np.float64 转换为 np.float32 完全改变了一些数字的值

python - 没有名为 psycopg2 的模块

mysql - 使用 pip 安装 mysql

linux - 如何测试程序无法连接到 Internet 时的行为?

php - 数据库条目 php 上的密码哈希值被更改

python - Django 表单字段验证错误消息如 "Please fill out this field"

Python scipy/Fortran : float64, 实数,双倍?

linux - 在 Ubuntu 启动时运行 Python 脚本 [失败]

mysql - 为什么在oracle中引入散列分区?有什么好处

arrays - Perl:强制按数字顺序散列