【问题标题】:How to reverse a given Boolean value in a list?如何反转列表中给定的布尔值?
【发布时间】:2019-02-20 23:04:05
【问题描述】:

我正在尝试解决熄灯谜题。我使用布尔值的二维列表(例如[[True, True, True], [True, True, True], [True, True, True]])来表示灯光的状况。 我想在给定位置(例如(1,1))反转布尔值,我编码为:

class LightsOutPuzzle(object):

    def __init__(self, board):
        self.board = board

    def get_board(self):
        return self.board

    def perform_move(self, row, col):      
        self.board[row][col] = not self.board[row][col]
        print(self.board)
        return LightsOutPuzzle(self.board)

我调用 perform_move(1,1) on

[[False, False, False], [False, False, False], [False, False, False]]

但结果是:

[[False, True, False], [False, True, False], [False, True, False]]

这让我很困惑。你能告诉我它有什么问题吗?完成这项任务的正确方法是什么? 非常感谢您的帮助!

我正在使用这个函数来生成新的板:

def create_puzzle(rows, cols):
    c = []
    r = []
    for x in range(cols):
        c.append(False)
    for y in range(rows):
        r.append(c)
    return LightsOutPuzzle(r)

它会导致问题吗?

非常感谢您的回复!!! QQ号

【问题讨论】:

  • 您初始化板以具有与所有行相同的单个列表。可能类似于board = [[] * 3] 而不是board = [[], [], []]
  • 这可能是怎么回事:stackoverflow.com/questions/240178/…
  • 预期的结果是什么?你知道 Python 从 0 开始吗​​?
  • 换句话说,问题不在于您发布的代码,而在于您用于初始化原始板的代码。你应该用LightsOutPuzzle([[True]*3 for _ in range(3)])初始化它。
  • 非常感谢你们!现在问题解决了,我真的没想到原因!我从中吸取了教训!再次感谢!!!

标签: python list boolean


【解决方案1】:

您可以在 init 方法本身中执行此操作,然后更改 perform_move 方法, 试试这个

class LightsOutPuzzle(object):

def __init__(self, board):
    self.board = board
    board = [not i for i in board]
    print(board)

def get_board(self):
    return self.board

def perform_move(self, row, col):
    self.board[row][col] = not self.board[row][col]
    print(self.board)
    return LightsOutPuzzle(self.board)

def main():
    LightsOutPuzzle([False, False, False])


if __name__ == '__main__':
    main()

【讨论】:

    【解决方案2】:

    我在你的代码中看到的探测语句在函数 def create_puzzle(rows, cols)

    def create_puzzle(rows, cols):

    c = []
    r = []
    
    for x in range(cols):  
        c.append(False)    #Statement1
    
    for y in range(rows):  
        r.append(c)        #Statement2
    
    return LightsOutPuzzle(r)
    

    Statement1 : 将元素追加到列表 #[False, False, False] 假设 id(c) 为 0x1000

    Statement2 :此语句会将 Same List (c) 附加到您的 rowList 结果(参考 id):[0x1000, 0x1000, 0x1000]

    因此您的行将引用相同的列表,这就是您在其中一列列表中进行更改的原因,它也反映在所有其他列列表中

    更改您的 create_puzzle

    def create_puzzle(rows, cols):

         myBoard = [[False]*cols for i in range(rows)]
         return LightsOutPuzzle(myBoard )
    

    【讨论】:

    • 谢谢你的详细解释!!现在我很清楚那个 XD !!
    猜你喜欢
    • 2019-01-06
    • 2018-02-19
    • 2015-06-19
    • 2020-03-27
    • 1970-01-01
    • 2014-06-13
    • 2011-06-03
    • 2020-04-15
    • 2020-04-09
    相关资源
    最近更新 更多