You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何编写函数替换随机生成的二维列表中的指定字符?

如何替换二维列表中的指定字符(附代码修正)

你需要替换随机生成的二维列表中的特定字符,比如把所有"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()

关键修正说明

  1. clean函数重构:改成通用替换函数,接收目标字符和替换字符,通过嵌套循环遍历二维列表的每个元素,判断后执行替换操作。
  2. count函数完善:接收目标字符参数,遍历用户指定的行和列范围(注意列表索引从0开始,range(endRow+1)会包含endRow行),统计匹配的字符数量。
  3. getEndPoint函数完善:添加输入验证,确保用户输入的行和列在有效范围内,避免索引越界错误。
  4. display函数优化:打印元素时添加空格,让输出更易读。
  5. 主流程调整:明确初始世界和清理后世界的显示逻辑,让整个流程更清晰。

如果需要实现你举例的“把0换成9”功能,只需在调用clean时传入对应参数,比如clean(world, "0", "9"),前提是你的二维列表包含"0"字符。

内容的提问来源于stack exchange,提问作者Dream Cloud

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.11 08:35:20