为什么我用Python实现的自定义有序列表无法添加第二个元素,如何修复?
问题原因
- 核心问题出在
add方法的赋值逻辑:Python类的实例方法中,self是指向当前实例的局部变量,直接对self执行赋值操作(self = xxx)只会改变这个局部变量的指向,不会修改原实例本身。你第一次添加元素时使用self.append(x)属于原地修改列表实例内容,所以修改能同步到外部的sl对象;第二次添加时你直接给self赋值为新拼接的列表,只是让方法内的self指向了新对象,外部的sl实例完全没有发生变化。 - 额外的逻辑错误:你拼接列表的写法有误,
self + [x] + self[index:]会把原列表完整保留后再加新元素和后半段,当插入位置不是列表末尾时会出现元素重复,正确的拼接逻辑应该是self[:index] + [x] + self[index:]。 - 冗余错误:
__init__方法中的self = []完全无效,继承list后父类默认初始化已经会创建空列表,这行代码只是修改局部变量指向,没有任何作用。
修复方案
直接使用bisect算出的插入位置调用列表自带的insert方法原地插入即可,不需要手动拼接列表,也不需要额外判断列表是否为空:
from bisect import bisect class SortedList(list): def add(self, x): index = bisect(self, x) self.insert(index, x)
修复后完整可运行代码
from bisect import bisect class SortedList(list): def add(self, x): index = bisect(self, x) self.insert(index, x) t = 1 for _ in range(t): n, a, b = 24, 3, 5 if b == 1: print('yes') else: sl = SortedList() st = set() sl.add(1) st.add(1) i = 0 while sl[i] < n: num1 = sl[i] * a num2 = sl[i] + b if num1 > sl[i] and num1 not in st: sl.add(num1) st.add(num1) if num2 > 1 and num2 not in st: sl.add(num2) st.add(num2) if n in st: break i += 1 print('yes' if n in st else 'no')
运行上述代码会输出yes,符合预期。
内容的提问来源于stack exchange,提问作者Valerie Ogonor
相关产品推荐
相关产品推荐

