如何编写函数替换随机生成的二维列表中的指定字符?
如何替换二维列表中的指定字符(附代码修正)
你需要替换随机生成的二维列表中的特定字符,比如把所有"O"(POOP)替换成"."(CLEANED),你的代码存在几个关键问题导致无法运行,下面是修正方案和解释。
你的代码里的关键问题
- clean函数语法错误:
if world == POOP, POOP == CLEAN:逻辑完全错误,world是二维列表,不能直接和单个字符比较,且CLEAN未定义(应为CLEANED),同时缺少遍历列表执行替换的逻辑。 - count函数未实现计数逻辑:仅获取了用户输入的字符,但没有遍历列表统计数量,返回的
number始终为0。 - getEndPoint函数未获取有效输入:直接返回-1,-1,没有让用户输入实际的行和列范围,导致计数和替换没有有效范围依据。
修正后的完整代码
import random SIZE = 4 EMPTY = " " PERSON = "P" PET = "T" POOP = "O" ERROR = "!" CLEANED = "." MAX_RANDOM = 10 def clean(world, target_char, replace_char): # 遍历二维列表的每一行和每一列,执行替换 for r in range(SIZE): for c in range(SIZE): if world[r][c] == target_char: world[r][c] = replace_char print("Scooping the poop") # 统计指定范围内目标字符的数量 def count(world, endRow, endColumn, target_char): print("Counting number of occurances of a character") number = 0 # 遍历到用户指定的行和列(索引从0开始) for r in range(endRow + 1): for c in range(endColumn + 1): if world[r][c] == target_char: number += 1 return number # 随机生成单个元素的逻辑保留 def createElement(): tempNum = random.randrange(MAX_RANDOM)+1 if ((tempNum >= 1) and (tempNum <= 5)): tempElement = EMPTY elif ((tempNum >= 6) and (tempNum <= 7)): tempElement = PERSON elif (tempNum == 8): tempElement = PET elif ((tempNum >= 9) and (tempNum <= 10)): tempElement = POOP else: tempElement = ERROR return(tempElement) # 创建二维世界的逻辑保留 def createWorld(): world = [] r = 0 while (r < SIZE): tempRow = [] world.append(tempRow) c = 0 while (c < SIZE): element = createElement() tempRow.append(element) c = c + 1 r = r + 1 return(world) # 显示世界的逻辑优化(添加空格让输出更清晰) def display(world): print("OUR WORLD") print("========") r = 0 while (r < SIZE): c = 0 while (c < SIZE): print(world[r][c], end=" ") c = c + 1 print() r = r + 1 # 获取用户输入的有效行和列索引(带输入验证) def getEndPoint(): while True: try: endRow = int(input(f"输入结束行索引(0到{SIZE-1}):")) endColumn = int(input(f"输入结束列索引(0到{SIZE-1}):")) if 0 <= endRow < SIZE and 0 <= endColumn < SIZE: return(endRow, endColumn) else: print(f"请输入0到{SIZE-1}之间的整数") except ValueError: print("请输入有效的整数") # 主流程调整,让逻辑更清晰 def start(): world = createWorld() print("初始世界:") display(world) endRow,endColumn = getEndPoint() element = input("Enter character: ") number = count(world, endRow, endColumn, element) print(f"# occurances of {element}={number}") # 替换POOP为CLEANED,若要实现类似"0换9"的功能,修改参数即可 clean(world, POOP, CLEANED) print("\n清理后的世界:") display(world) start()
关键修正说明
- clean函数重构:改成通用替换函数,接收目标字符和替换字符,通过嵌套循环遍历二维列表的每个元素,判断后执行替换操作。
- count函数完善:接收目标字符参数,遍历用户指定的行和列范围(注意列表索引从0开始,
range(endRow+1)会包含endRow行),统计匹配的字符数量。 - getEndPoint函数完善:添加输入验证,确保用户输入的行和列在有效范围内,避免索引越界错误。
- display函数优化:打印元素时添加空格,让输出更易读。
- 主流程调整:明确初始世界和清理后世界的显示逻辑,让整个流程更清晰。
如果需要实现你举例的“把0换成9”功能,只需在调用clean时传入对应参数,比如clean(world, "0", "9"),前提是你的二维列表包含"0"字符。
内容的提问来源于stack exchange,提问作者Dream Cloud
相关产品推荐
相关产品推荐

