鱼C论坛

 找回密码
 立即注册
查看: 3196|回复: 4

[已解决]一个Py题:我看不懂报错内容

[复制链接]
发表于 2021-5-24 11:51:32 | 显示全部楼层 |阅读模式

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

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

x
本帖最后由 Peteryo01223 于 2021-5-24 11:56 编辑

题目:500个小孩,围成一个圈。从第一个小孩开始计数,每次逢3,或3的倍数,出圈,如:3/6/27/468等等。直到最后剩一个小孩,请问他(她)最初的编号是多少?
答案:
  1. # 第一个类:kid
  2. # 第二个类:circle
  3. # kid 属性:编号gid,lefthand、righthand
  4. # 圈属性:head 和 tail。
  5. # 圈的行为:加入(add)一个小孩,移除(remove)一个小孩。

  6. class Kid:
  7.     def __init__(self, gid):
  8.         self.gid = gid # 小孩属性之编号
  9.         self.left = None # 小孩属性之左手
  10.         self.right = None # 小孩属性之右手


  11. class Circle:
  12.     # 初始化的时候,定义圈的头和尾
  13.     def __init__(self, count):
  14.         self.head = None
  15.         self.tail = None

  16.         for i in range(count):
  17.             self.add(Kid(i+1))

  18.     def add(self, kid):
  19.         # 向圈里,加入一个小孩
  20.         if self.head is None and self.tail is None:
  21.             self.head = kid
  22.             self.tail = kid
  23.             kid.left = kid
  24.             kid.right = kid
  25.         else:
  26.             kid.left = self.head
  27.             kid.right = self.tail
  28.             self.head.right = kid
  29.             self.tail.left = kid
  30.             self.tail = kid

  31.     def remove(self, kid):
  32.         # 从圈里面移除一个小孩
  33.         if kid is self.head:
  34.             self.head = kid.left
  35.         if kid is self.left:
  36.             self.tail = kid.right

  37.         kid.left.right = kid.right
  38.         kid.right.left = kid.left
  39.         kid.left = None
  40.         kid.right = None


  41. circle = Circle(500)
  42. cur = circle.head # 指针指向开头
  43. step = 1

  44. while circle.head is not circle.tail:
  45.     # 当圈里不只一个小孩的时候,就继续
  46.     cur = cur.left
  47.     if step % 3 == 0:
  48.         circle.remove(cur.right)
  49.     step += 1

  50. print(circle.head.gid)
复制代码


报错内容:
  1. D:\PycharmProjects\learnpython\venv\Scripts\python.exe D:/PycharmProjects/learnpython/ch7/20210524a.py
  2. Traceback (most recent call last):
  3.   File "D:/PycharmProjects/learnpython/ch7/20210524a.py", line 58, in <module>
  4.     circle.remove(cur.right)
  5.   File "D:/PycharmProjects/learnpython/ch7/20210524a.py", line 41, in remove
  6.     if kid is self.left:
  7. AttributeError: 'Circle' object has no attribute 'left'
复制代码

看不懂报错内容,请高手们指点迷津,谢谢~此题难度太大了,我实在不会改。
最佳答案
2021-5-24 12:18:09


Circle 类中的  remove 方法的第二个 if 条件 self.left 改成 self.tail 即可

  1.     def remove(self, kid):
  2.         # 从圈里面移除一个小孩
  3.         if kid is self.head:
  4.             self.head = kid.left
  5.         if kid is self.tail:
  6.             self.tail = kid.right

  7.         kid.left.right = kid.right
  8.         kid.right.left = kid.left
  9.         kid.left = None
  10.         kid.right = None
复制代码


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

使用道具 举报

发表于 2021-5-24 12:18:09 | 显示全部楼层    本楼为最佳答案   


Circle 类中的  remove 方法的第二个 if 条件 self.left 改成 self.tail 即可

  1.     def remove(self, kid):
  2.         # 从圈里面移除一个小孩
  3.         if kid is self.head:
  4.             self.head = kid.left
  5.         if kid is self.tail:
  6.             self.tail = kid.right

  7.         kid.left.right = kid.right
  8.         kid.right.left = kid.left
  9.         kid.left = None
  10.         kid.right = None
复制代码


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

使用道具 举报

 楼主| 发表于 2021-5-24 13:19:17 | 显示全部楼层
Twilight6 发表于 2021-5-24 12:18
Circle 类中的  remove 方法的第二个 if 条件 self.left 改成 self.tail 即可

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

使用道具 举报

 楼主| 发表于 2021-5-24 13:33:16 | 显示全部楼层
Twilight6 发表于 2021-5-24 12:18
Circle 类中的  remove 方法的第二个 if 条件 self.left 改成 self.tail 即可


多问你一句:第26-29行,我能四行合并如下么?
  1. self.head = self.tail = kid.left = kid.right = kid
复制代码

我试了试,Python 答案变成 1 了,感觉不能这么写。但是,我不懂背后的逻辑。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-5-24 13:42:18 | 显示全部楼层
Peteryo01223 发表于 2021-5-24 13:33
多问你一句:第26-29行,我能四行合并如下么?

我试了试,Python 答案变成 1 了,感觉不能这么写。 ...



可以这样写呀,而且最后值不会改变,是等价的

因为赋值操作,是将左边的值赋值给右边,所以这样相当于将 kid 依次赋值给了 kid.right、kid.left、self.tail、self.head

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-7-3 23:07

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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