Python简单桶排序算法未按预期运行问题排查
问题排查:你的分桶算法为啥不符合预期?
嘿,这个坑我之前也踩过!问题出在你初始化acd列表的方式上:
acd = [[]] * len(bounds)
在Python里,用[[]] * n创建列表的时候,里面的每个空列表其实都是同一个列表对象的引用,不是独立的新列表。也就是说,acd[0]、acd[1]、acd[2]指向的是同一个内存地址的列表。所以当你执行acd[i] += [d]的时候,不管i是0、1还是2,都是在修改同一个底层列表,最后所有桶里都会装着全部48个数字,这就和你预期的分桶效果完全相反了。
怎么修复?
把初始化acd的代码改成列表推导式,这样每个子列表都是独立创建的:
acd = [[] for _ in range(len(bounds))]
这样再运行你的代码,每个acd[i]都是一个全新的空列表,当你往里面加元素时,只会修改对应的桶,就能得到你想要的3个各含16个整数的桶了。
验证一下
修正后的完整代码:
ds = range(0, 48) bounds = [[0, 16], [16, 32], [32, 48]] acd = [[] for _ in range(len(bounds))] # 这里改了 for d in ds: for i in range(0, len(bounds)): if bounds[i][0] <= d < bounds[i][1]: print("Adding %s to %s" % (d, i)) acd[i] += [d] # 打印结果看看 print(acd)
运行后你会发现,acd的三个子列表分别包含了0-15、16-31、32-47的数字,完全符合预期。
内容的提问来源于stack exchange,提问作者Carpetfizz
相关产品推荐
相关产品推荐

