为啥我无法在 python 中正确使用 str.replace() 方法 [关闭]
Posted
技术标签:
【中文标题】为啥我无法在 python 中正确使用 str.replace() 方法 [关闭]【英文标题】:Why am I not able to properly use str.replace() method in python [closed]为什么我无法在 python 中正确使用 str.replace() 方法 [关闭] 【发布时间】:2015-05-12 14:23:49 【问题描述】:这是我第一次在这里发帖,如果我发错了请告诉我。我在这里阅读了很多主题以及其他网站上的信息。他们都说字符串是不可变的,我理解这一点,但我试图在我的自动填充功能中使用str.replace()
方法,但我似乎无法正确地把它放下。根本不可能吗?这是我的代码:
def main():
fileName = input("Please enter a filename: ")
file = open(fileName, 'r') # opens the file
content = file.readlines() # reads in the contents as a list
x=0 # x is a random variable used for while loop
while x < (len(content)-1): # while loop is used to remove the "\n" at the end
content[x] = content[x].strip() #strip method is used to remove \n
x=x+1 # adds 1 to x to help stop the loop
printBoard(content)
move = selection()
while move != "q" :
row = (int(move[0]))-1
column = (int(move[3])) -1
content = autoFill(content, row, column)
printBoard(content)
move = selection()
def autoFill(board, rows, columns):
if (board[rows][columns]) == 'X' :
return (board)
board[rows][columns] = ((board[rows][columns]).replace('O', 'X'))
print(board)
return (board)
这里是应该发生的事情的示例:
Please enter a filename: input.txt
OOOOOOXOOOO
OOOOOXOOOOO
OOOOXOOOOOO
XXOOXOOOOOO
XXXXOOOOOOO
OOOOOOOOOOO
Please enter a square to fill, or q to exit: 1, 1
XXXXXXXOOOO
XXXXXXOOOOO
XXXXXOOOOOO
XXXXXOOOOOO
XXXXOOOOOOO
OOOOOOOOOOO
但是当我运行它时。由于我的递归函数永远持续下去(直到运行时崩溃)
【问题讨论】:
您希望替换做什么?反而发生了什么?您为autoFill
函数提供了哪些输入?
你将board
反弹到str.replace()
返回值;一个新的字符串对象。您是否希望该函数返回整个棋盘?
所以这是一个充满 Os 和 Xs 的板,我希望替换功能将 O 更改为 X。
抱歉,我错误地提交了我的测试代码。但我只是想从列表中替换那个 1 索引。
那么仍然不清楚发生了什么以及您期望发生什么。如果可以,请向我们展示一个示例板(让它变小)以及调用函数时它会发生什么。
【参考方案1】:
我不确定您要做什么,但是,只有几个 cmets:
要从字符串末尾删除 任何 个 \n
字符,您可以使用
string = string.rstrip('\n')
在您使用 replace 的行中,您尝试对矩阵的单个单元格 (board[rows][columns]
) 执行替换,并且您正在将该单个单元格的替换结果分配给整个矩阵。我想你的意思实际上是:
board[rows][columns] = board[rows][columns].replace('O', 'X'))
编辑:既然你的单元格总是包含'O'
或'X'
,为什么不简单地写:
board[rows][columns] = 'X'
和
board[rows][columns] = 'O'
取决于您希望它们包含的新角色?
编辑2: 顺便说一句,执行剥离部分的更 Pythonic 方式是:
content = [line.rstrip('\n') for line in content]
EDIT3:据我所知,您的问题是字符串是不可变的,我错误地认为您正在使用字符列表。要将您的板子转换为字符列表(因此是可变的),只需执行以下操作:
new_board = []
for line in board:
new_line = [c for c in line]
new_board.append(new_line)
【讨论】:
是的,我用那个更新了我的代码:),但我仍然无法替换那个特定的单元格。当我运行它时,单元格实际上并没有被替换:( 我编辑了我的答案,我不确定你为什么要replace()
而不是仅仅覆盖新字符。
我试过你说的,它给了我错误:'str'对象不支持项目分配。这就是我尝试替换的原因,因为 python 有一个内置的 str.replace() 方法
再次编辑,这应该可以解决它。此时replace
不应该工作,因为它是一种字符串方法,而您正在使用字符列表,但您应该能够按照board[i][j] = 'X'
的方式做一些事情。
我试图变得懒惰,只是在不创建列表的情况下工作。但我会尝试的。我认为这将使使用代码变得更加容易。以上是关于为啥我无法在 python 中正确使用 str.replace() 方法 [关闭]的主要内容,如果未能解决你的问题,请参考以下文章