为什么我无法在python中正确使用str.replace()方法

时间:2015-05-12 14:23:49

标签: python string replace autofill

这是我第一次在这里发帖,如果发布错误,请告诉我。我在这里阅读了很多主题和其他网站上的信息。他们都说字符串是不可变的,我理解但是我试图在自动填充功能中使用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

但是当我跑的时候。因为我的递归函数永远存在(直到运行时崩溃),所以没有一个Os改为X.

1 个答案:

答案 0 :(得分:1)

我不确定你要做什么,但是,只是几条评论:

  • 要从字符串末尾删除任意\n个字符,您可以使用

    string = string.rstrip('\n')

  • 在您使用替换的行上,您尝试在矩阵的单个单元格(board[rows][columns])上执行替换,并将该单个单元格上的替换结果分配给整个矩阵。我认为你的意思实际上是:

    board[rows][columns] = board[rows][columns].replace('O', 'X'))

编辑:由于您的单元格始终包含'O''X',为什么不简单地写:

board[rows][columns] = 'X'

board[rows][columns] = 'O'

取决于您希望它们包含的新字符?

EDIT2: 正如旁注所示,更多的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)