使用重载方法进行散列

时间:2014-12-17 16:50:52

标签: 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()

1 个答案:

答案 0 :(得分:4)

问题在于您指的是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)