我有一个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()
答案 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)