(Python)将一个列表添加到另一个列表中而不使用括号

4

我正在用Python制作我的第一个项目 - 井字游戏,因为我认为这是一个很好的起点,但现在我遇到了瓶颈。

我目前将棋盘设置为列表 - Board = [1,2,3...,9],要重置,Board的内容被删除并重新输入到另一个列表中,但它也会添加括号。

有没有一种方法可以获取另一个列表的内容而不获取括号?

if newGame == 'Y' or 'y':
     del Board[:]
     Board.append(startBoard)
     print Board #for testing
 else:
     sys.exit('game over')

我所理解的是这样的:

我得到的结果看起来像这样:

[[1,2,3,4,5,6,7,8,9]]

有点偏题,但变量名通常是小写/驼峰命名法。请参阅PEP8 - Holloway
可能是重复问题:https://dev59.com/w3VC5IYBdhLWcg3wjx_u - GLHF
2
如果写成 if newGame == 'Y' or 'y' 的话,条件判断将总是为真。应该使用 if newGame =='Y' or newGame == 'y' 或者 if newGame in ('y', 'Y) 或者 if newGame.lower() = 'y' - Matthias
3个回答

17

使用extend方法。

Board.extend(startBoard)

或者您可以这样做:

Board = [el for el in startBoard]

同时省略 del Board[:] 语句。

或者你可以使用 copy 模块:

Board = copy.deepcopy(startBoard)

对我来说,最好的选择是这个:

Board = [i+1 for i in xrange(9)]

或者更简单的方法:

Board = range(1, 10) # python 2
或者
Board = list(range(1, 10)) # python 3

如评论中zehnpaard所建议。

同时,你也可以采用Erik Allik在他的答案中提出的方法。


如果还有其他对需要更新的Board的引用,第二种方法可能会引起问题。使用startBoard[:]会更简单,而不是使用列表推导式。 - zehnpaard
我不喜欢使用[:]的唯一原因是它只会进行浅拷贝。对于int类型来说还好,但对于复杂对象来说就不行了。除了deepcopy之外,也没有其他方法可以解决这个问题。 - dmg
如果你发现自己经常需要使用深拷贝,那么你应该考虑重新思考一下 :) - Erik Kaplun
说实话,复制具有可变状态的对象总是需要非常小心...如果我可以再挑剔一次(我保证!),我认为你最后一个建议在Python 2.x中应该更简单,即Board = range(1, 10),在Python 3.x中则为Board = list(range(1, 10)) - zehnpaard
@zehnpaard 很好的观点。我确实喜欢LCs,这就是为什么有时候我会使用它而不是更简单的“range”版本。 - dmg
Board = [el for el in startBoard] 也是一种浅拷贝。 - njzk2

0
如果你想就地清空和修改列表的内容(而不是创建一个新的列表并将其分配回持有旧列表的变量):
board[:] = startBoard

如果没有任何需要查看最新版内容的指向旧列表的情况,这与以下功能等效:

board = startBoard

如果您玩一下将相同内容分配给多个变量而不在过程中进行复制,您就可以了解原地修改和创建新的副本/实例意味着什么。

此外,请注意,由于在您的情况下startBoard是一个常量,因此您希望确保没有任何东西会修改它,因此第二个示例确实是非常糟糕的想法。但是还有第三个:

board = startBoard[:]

实际上,这是三种方法中最好的。它所做的是复制startBoard并将其分配给变量board,而不会修改旧列表board指向的内容。此外,由于您使用的是startBoard的副本,因此您可以确保您的起始板在未来始终保持相同。

请注意,这些方面仅在使用可变数据类型的编程语言或风格中出现;在函数式编程中,几乎没有任何东西被修改,因此您可以完全忽略担心通过触及其他人依赖的内容而导致意外的负面影响。

此外:请注意,在Python中可以以多种方式复制列表;从我目前正在讲述的高层次角度来看,几乎没有区别,因此copy.copy(startBoard)[x for x in startBoard)startBoard[:]等效。

另请参阅PEP8,其中提供了有用的编码约定。


0

试试这个:

for x in startBoard:
    Board.append(x)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接