鱼C论坛

 找回密码
 立即注册
查看: 1982|回复: 3

[已解决]047讲动动手问题

[复制链接]
发表于 2021-6-17 13:55:04 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 fc5igm 于 2021-6-17 15:53 编辑
动动手(一定要自己动手试试哦~):

0. 根据课堂上的例子,定制一个列表,同样要求记录列表中每个元素被访问的次数。这一次我们希望定制的列表功能更加全面一些,比如支持 append()、pop()、extend() 原生列表所拥有的方法。你应该如何修改呢?

要求1:实现获取、设置和删除一个元素的行为(删除一个元素的时候对应的计数器也会被删除)
要求2:增加 counter(index) 方法,返回 index 参数所指定的元素记录的访问次数
要求3:实现 append()、pop()、remove()、insert()、clear() 和 reverse() 方法(重写这些方法的时候注意考虑计数器的对应改变)

针对该问题所做的代码中以下部分无法正常运行
  1.     def pop(self):
  2.         return self.values[len(self.values)-1]
  3.         del self.count[self.values[len(self.values)-1]]
  4.         del self.values[len(self.values)-1]
复制代码

下面是完整的全部代码
  1. class CountList:
  2.     def __init__(self,*args):
  3.         self.values=[x for x in args]
  4.         self.count={}.fromkeys(range(len(self.values)),0)
  5.         self.stack=dict()
  6.         self.rvalues=list()
  7.     def __len__(self):
  8.         return len(self.values)
  9.     def __getitem__(self,key):
  10.         self.count[key]+=1
  11.         return self.values[key]
  12.     def __delitem__(self,key):
  13.         del self.count[key]
  14.         del self.values[key]
  15.     def counter(self,key):
  16.         return self.count[key]
  17.     def append(self,key):
  18.         self.values=self.values+[key]
  19.         self.count[len(self.values)-1]=0
  20.     def pop(self):
  21.         return self.values[len(self.values)-1]
  22.         del self.count[self.values[len(self.values)-1]]
  23.         del self.values[len(self.values)-1]
  24.     def remove(self,key):
  25.         self.stack=self.count
  26.         self.rvalues=self.values
  27.         for i in range(len(self.values)):
  28.             try:
  29.                 if self.values[i]==key:
  30.                     del self.rvalues[i]
  31.                     del self.stack[i]
  32.             except IndexError:
  33.                 pass
  34.         self.count=self.stack
  35.         self.values=self.rvalues
  36.         self.stack=dict()
  37.         self.rvalues=list()
  38.     def insert(self,index,key):
  39.         self.values=self.values[:index]+[key]+self.values[index:]
  40.         for i in range(len(self.values)):
  41.             if i<index:
  42.                 self.stack[i]=self.count[i]
  43.             elif i==index:
  44.                 self.stack[i]=0
  45.             else:
  46.                 self.stack[i]=self.count[i-1]
  47.         self.count=self.stack
  48.         self.stack=dict()
  49.     def clear(self):
  50.         self.count=dict()
  51.         self.values=list()
  52.     def reverse(self):
  53.         for i in range(len(self.values)-1,-1,-1):
  54.             self.rvalues.append(self.values[i])
  55.             self.stack[len(self.values)-1-i]=self.count[i]
  56.         self.values=self.rvalues
  57.         self.count=self.stack
  58.         self.rvalues=list()
  59.         self.stack=dict()


  60. c1=CountList(0,1,2,3)
  61. c1[1]
  62. c1[2]
  63. c1[2]
  64. c1[3]
  65. c1[3]
  66. c1[3]
  67. c1.append(4)
  68. c1[4]
  69. c1[4]
  70. c1[4]
  71. 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]
  1. >>> c1.values
  2. [0, 1, 2, 3, 4]
  3. >>> c1.count
  4. {0: 0, 1: 1, 2: 2, 3: 3, 4: 4}
  5. >>> c1.pop()
  6. 4
  7. >>> c1.values
  8. [0, 1, 2, 3, 4]
  9. >>> c1.count
  10. {0: 0, 1: 1, 2: 2, 3: 3, 4: 4}
  11. >>> del c1.count[c1.values[len(c1.values)-1]]
  12. >>> c1.count
  13. {0: 0, 1: 1, 2: 2, 3: 3}
  14. >>> del c1.values[len(c1.values)-1]
  15. >>> c1.values
  16. [0, 1, 2, 3]
复制代码


求问导致pop(self)在类中运行失效的原因是什么?
最佳答案
2021-8-14 16:52:41
本帖最后由 bravsheng 于 2021-8-14 16:56 编辑

厉害,真棒!你是全部用自己的方法实现了列表所有功能。  
我刚学完这课,比起小甲鱼,我觉得你的答案更符合我的期待!   \^o^/
和你一样,我也是延续了字典的思路,方法大致差不多,不过列表部分(self.value)我是直接用了内置方法。
还有个细节你可能漏掉了:字典部分__delitem__那段代码有个下标问题,也要进行修改。

小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2021-6-17 15:35:46 | 显示全部楼层
顶帖
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2021-8-14 16:47:09 | 显示全部楼层
本帖最后由 bravsheng 于 2021-8-14 16:53 编辑

因为你先进行了return,所以下面两个del就没能执行。

评分

参与人数 1贡献 +1 收起 理由
fc5igm + 1 鱼C有你更精彩^_^

查看全部评分

小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

发表于 2021-8-14 16:52:41 | 显示全部楼层    本楼为最佳答案   
本帖最后由 bravsheng 于 2021-8-14 16:56 编辑

厉害,真棒!你是全部用自己的方法实现了列表所有功能。  
我刚学完这课,比起小甲鱼,我觉得你的答案更符合我的期待!   \^o^/
和你一样,我也是延续了字典的思路,方法大致差不多,不过列表部分(self.value)我是直接用了内置方法。
还有个细节你可能漏掉了:字典部分__delitem__那段代码有个下标问题,也要进行修改。

小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-6-20 04:26

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表