问题1:AttributeError: ‘dict’ object has no attribute ‘has_key’
if not ssCnt.has_key(can): ssCnt[can]=1
else: ssCnt[can] += 1
错误原因:Python3中删除了has_key方法
解决方案:使用if key not in dict:
if can not in ssCnt:
问题2:TypeError: object of type ‘map’ has no len()
numItems = float(len(D))
错误原因:Python3中map没有len方法
解决方法:将map转换成list,再通过len求得长度。
numItems = float(len(D_list))
但是,改完之后运行程序,得到的len是0。经过测试得知,遍历map之后,再通过list方法进行转换,得到的是空列表。因此可以在遍历map之前,先将其转换为list,这样直接遍历list即可,并且可以重复遍历。
考虑Ck,其类型也是一个map,且其处于内循环之中,因此需要遍历多次,如果直接遍历Ck,那么在一个遍历结束之后将无法再次遍历Ck。因此可以在函数开始的位置,同时将Ck也转换为list类型,以便多次遍历。修改后的程序如下:
def scanD(D, Ck, minSupport):
D_list = list(D)
Ck_list = list(Ck)
ssCnt = {}
for tid in D_list:
for can in Ck_list:
if can.issubset(tid):
if can not in ssCnt:
ssCnt[can] = 1
else:
ssCnt[can] += 1
numItems = float(len(D_list))
retList = []
supportData = {}
for key in ssCnt:
support = ssCnt[key] / numItems
if support >= minSupport:
retList.insert(0, key)
supportData[key] = support
return retList, supportData