【问题标题】:bubble sorting switch and rotate challenge气泡排序开关和旋转挑战
【发布时间】:2018-10-23 02:01:28
【问题描述】:

我正在尝试创建一个 MarblesBoard 类,还包括开关和旋转功能。

我的代码如下:

class MarblesBoard():
def __init__(self, balls):
    self.balls = balls
def __repr__(self):
    return " ".join(str(i) for i in self.balls)

def switch(self):
    lst=list(self.balls)
    lst[0], lst[1] = lst[1], lst[0]        
    return lst

def rotate(self): 
    lst=list(self.balls)
    lst = lst[1:]+lst[:1]
    return self.balls

输出应该是这样的:

>>> board = MarblesBoard((3,6,7,4,1,0,8,2,5)) 
>>> board 
3 6 7 4 1 0 8 2 5 
>>> board.switch() 
>>> board 
6 3 7 4 1 0 8 2 5 
>>> board.rotate() 
>>> board 
3 7 4 1 0 8 2 5 6 
>>> board.switch() 
>>> board 
7 3 4 1 0 8 2 5 6

但是,当我使用 switch 或 rotate 时,它​​会调用原始球列表。不知道如何解决这个问题。

【问题讨论】:

    标签: python python-3.x list sorting


    【解决方案1】:

    您实际上并没有修改self.balls,只是返回一个修改后的列表。

    如果您想保持您的方法基本相同,并继续使用元组,您可以更改switch() 的定义,以实际将更改写入self.balls,方法如下:

      def switch(self):
          lst=list(self.balls)
          lst[0], lst[1] = lst[1], lst[0]  
          self.balls = tuple(lst)
    

    同样,您可以将rotate() 更改为如下内容:

      def rotate(self): 
          lst=list(self.balls)
          lst = lst[1:]+lst[:1]
          self.balls=tuple(lst)
    

    【讨论】:

      【解决方案2】:

      您的方法正在返回列表。如果要修改对象,则必须更改self.balls 而不是returning。像这样:

      class MarblesBoard:
      
          def __init__(self, balls):
              self.balls = balls
      
          def __repr__(self):
              return " ".join(str(i) for i in self.balls)
      
          def switch(self):
              self.balls[0], self.balls[1] = self.balls[1], self.balls[0]
      
          def rotate(self):
              self.balls = self.balls[1:] + self.balls[:1]
      

      【讨论】:

      • 感谢 Nog642,但是,我收到错误 TypeError: 'tuple' object does not support item assignment
      • 是的,如果self.balls 以元组开始,那么我编写的switch 方法将不起作用,因为正如错误所说,您不能分配给元组索引。在这种情况下,您可以按照您在问题中实现它的方式来实现它,只是将最后一行 return lst 替换为 self.balls = tuple(list)
      最近更新 更多