|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
本帖最后由 fc5igm 于 2021-6-17 15:53 编辑
动动手(一定要自己动手试试哦~):
0. 根据课堂上的例子,定制一个列表,同样要求记录列表中每个元素被访问的次数。这一次我们希望定制的列表功能更加全面一些,比如支持 append()、pop()、extend() 原生列表所拥有的方法。你应该如何修改呢?
要求1:实现获取、设置和删除一个元素的行为(删除一个元素的时候对应的计数器也会被删除)
要求2:增加 counter(index) 方法,返回 index 参数所指定的元素记录的访问次数
要求3:实现 append()、pop()、remove()、insert()、clear() 和 reverse() 方法(重写这些方法的时候注意考虑计数器的对应改变)
针对该问题所做的代码中以下部分无法正常运行
- def pop(self):
- return self.values[len(self.values)-1]
- del self.count[self.values[len(self.values)-1]]
- del self.values[len(self.values)-1]
复制代码
下面是完整的全部代码
- class CountList:
- def __init__(self,*args):
- self.values=[x for x in args]
- self.count={}.fromkeys(range(len(self.values)),0)
- self.stack=dict()
- self.rvalues=list()
- def __len__(self):
- return len(self.values)
- def __getitem__(self,key):
- self.count[key]+=1
- return self.values[key]
- def __delitem__(self,key):
- del self.count[key]
- del self.values[key]
- def counter(self,key):
- return self.count[key]
- def append(self,key):
- self.values=self.values+[key]
- self.count[len(self.values)-1]=0
- def pop(self):
- return self.values[len(self.values)-1]
- del self.count[self.values[len(self.values)-1]]
- del self.values[len(self.values)-1]
- def remove(self,key):
- self.stack=self.count
- self.rvalues=self.values
- for i in range(len(self.values)):
- try:
- if self.values[i]==key:
- del self.rvalues[i]
- del self.stack[i]
- except IndexError:
- pass
- self.count=self.stack
- self.values=self.rvalues
- self.stack=dict()
- self.rvalues=list()
- def insert(self,index,key):
- self.values=self.values[:index]+[key]+self.values[index:]
- for i in range(len(self.values)):
- if i<index:
- self.stack[i]=self.count[i]
- elif i==index:
- self.stack[i]=0
- else:
- self.stack[i]=self.count[i-1]
- self.count=self.stack
- self.stack=dict()
- def clear(self):
- self.count=dict()
- self.values=list()
- def reverse(self):
- for i in range(len(self.values)-1,-1,-1):
- self.rvalues.append(self.values[i])
- self.stack[len(self.values)-1-i]=self.count[i]
- self.values=self.rvalues
- self.count=self.stack
- self.rvalues=list()
- self.stack=dict()
- c1=CountList(0,1,2,3)
- c1[1]
- c1[2]
- c1[2]
- c1[3]
- c1[3]
- c1[3]
- c1.append(4)
- c1[4]
- c1[4]
- c1[4]
- c1[4]
复制代码
在运行页单独运行pop(self)部分内部的代码却显示没有问题
pop()方法整体运行无效
pop()方法下的这三条代码单独运行则全部成功
return self.values[len(self.values)-1]
del self.count[self.values[len(self.values)-1]]
del self.values[len(self.values)-1]
- >>> c1.values
- [0, 1, 2, 3, 4]
- >>> c1.count
- {0: 0, 1: 1, 2: 2, 3: 3, 4: 4}
- >>> c1.pop()
- 4
- >>> c1.values
- [0, 1, 2, 3, 4]
- >>> c1.count
- {0: 0, 1: 1, 2: 2, 3: 3, 4: 4}
- >>> del c1.count[c1.values[len(c1.values)-1]]
- >>> c1.count
- {0: 0, 1: 1, 2: 2, 3: 3}
- >>> del c1.values[len(c1.values)-1]
- >>> c1.values
- [0, 1, 2, 3]
复制代码
求问导致pop(self)在类中运行失效的原因是什么?
本帖最后由 bravsheng 于 2021-8-14 16:56 编辑
厉害,真棒!你是全部用自己的方法实现了列表所有功能。
我刚学完这课,比起小甲鱼,我觉得你的答案更符合我的期待! \^o^/
和你一样,我也是延续了字典的思路,方法大致差不多,不过列表部分(self.value)我是直接用了内置方法。
还有个细节你可能漏掉了:字典部分__delitem__那段代码有个下标问题,也要进行修改。
|
|