《Machine Learning in Action》Chapter 11 Apriori Python代码不兼容问题总结

问题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

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值