Python 替换列表中字符串的字符

Python 替换列表中字符串的字符,python,string,replace,Python,String,Replace,我明白了: state = ( "##### ", "### #", "## o ##", " #####" ) 我需要o向右移一个 "## o ##" 到 问题是,对于边缘情况,is必须非常健壮,例如: "o ##" 我把smth编码成那样,但它不会那样工作 def move(state, direction):

我明白了:

state = (
    "#####   ",
    "###    #",
    "##  o ##",
    "   #####"
)
我需要o向右移一个

"##  o ##"

问题是,对于边缘情况,is必须非常健壮,例如:

"o ##"
我把smth编码成那样,但它不会那样工作

def move(state, direction):
   
    for indx,i in enumerate(state):
        if "o" in i:
            line_indx= indx
            
    string_indx = state[line_indx].find("o")
    print(line_indx,string_indx)
    
    a=[]
    if direction.lower() == "rechts" and state[line_indx][string_indx+1] == " ":
        print("that would work")
        for i in state:
            if "o" not in i:
                a.append(i)
            elif "o" in i:
                a.append(i[:i.find("o")] + " o" + i[i.find("o")+1:])
我必须摆脱切片的东西,但不知道如何

提前谢谢

编辑: 输出应该如下所示

state = (
    "#####   ",
    "###    #",
    "##   o##",
    "   #####"
)
E2:


工作正常,但必须有更好的解决方案…

如果您想将o转换为o,代码如下。假设状态为列表,正如您在问题中提到的列表

for indx,i in enumerate(state):
    if "o " in i:
            line_indx= indx
            state[indx]=i.replace("o ","o")
print(state)

如果你想把o转换成o,下面是代码。假设状态为列表,正如您在问题中提到的列表

for indx,i in enumerate(state):
    if "o " in i:
            line_indx= indx
            state[indx]=i.replace("o ","o")
print(state)
我将使用re模块实现以下目的:

import re
state = (
    "#####   ",
    "###    #",
    "##  o ##",
    "   #####"
)
new_state = tuple(re.sub(r"(o)(\s)", r"\2\1", i) for i in state)
print(new_state)
输出:

('#####   ', '###    #', '##   o##', '   #####')
请注意,这将为每个右有空格的o交换每个右有空格的o。说明:我为它们使用了所谓的捕获组和引用。

我将使用re模块实现以下目的:

import re
state = (
    "#####   ",
    "###    #",
    "##  o ##",
    "   #####"
)
new_state = tuple(re.sub(r"(o)(\s)", r"\2\1", i) for i in state)
print(new_state)
输出:

('#####   ', '###    #', '##   o##', '   #####')

请注意,这将为每个右有空格的o交换每个右有空格的o。说明:我为它们使用了所谓的捕获组和引用。

我认为解决这个问题的最简单方法是检查每一行是否包含“o”。如果确实希望该行是“o”行[0:idx]之前的所有内容,则“o”前面加上空格o,然后是“o”之后的所有内容,这说明了新添加的空格行[idx+2:]

这将提供以下输出:

('#####   ', '###    #', '##   o##', '   #####')
编辑

我在注释中看到,您还希望能够向左移动,等等。在这种情况下,您可以使用相应地处理行的函数调用替换if语句的内容,即:

def left(line, idx):
    return line[0:idx - 1] + "o " + line[idx + 1:]

def right(line, idx):
    return line[0:idx] + " o" + line[idx + 2:]
然后在循环内部:

...
if 'o' in line:
    idx = line.find('o')
    line = left(line, idx)
...

我想说解决这个问题的最简单方法是检查每一行是否包含“o”。如果确实希望该行是“o”行[0:idx]之前的所有内容,则“o”前面加上空格o,然后是“o”之后的所有内容,这说明了新添加的空格行[idx+2:]

这将提供以下输出:

('#####   ', '###    #', '##   o##', '   #####')
编辑

我在注释中看到,您还希望能够向左移动,等等。在这种情况下,您可以使用相应地处理行的函数调用替换if语句的内容,即:

def left(line, idx):
    return line[0:idx - 1] + "o " + line[idx + 1:]

def right(line, idx):
    return line[0:idx] + " o" + line[idx + 2:]
然后在循环内部:

...
if 'o' in line:
    idx = line.find('o')
    line = left(line, idx)
...

假设您希望能够在所有四个方向上移动,而不仅仅是向右移动。 在我看来,对于建议的这类问题,使用可变序列更容易。 即,使用嵌套列表作为状态,而不是STR的不可变元组。 如果无法更改函数签名,可以使用如下类型转换:

输入类型为t 从枚举导入枚举 State=t.Tuple[str,…] 位置=t.Tuple[int,int] 类方向TR,枚举: 向上 向下 左=左 右=右 def获取位置状态:状态->位置: o_索引=[x,y代表x,y代表y处于枚举状态的行,如果项==o,则为枚举行中的项] 断言leno_索引==1,必须正好有一个o。 返回o_指数[0] def movestate:状态,方向:方向->状态: x、 y=old\u x,old\u y=get\u positionstate 如果方向==向下: x+=1 elif方向==向上: x-=1 elif方向==右侧: y+=1 elif方向==左: y-=1 断言移动的有效性:
断言0假设您希望能够在所有四个方向上移动,而不仅仅是向右移动。 在我看来,对于建议的这类问题,使用可变序列更容易。 即,使用嵌套列表作为状态,而不是STR的不可变元组。 如果无法更改函数签名,可以使用如下类型转换:

输入类型为t 从枚举导入枚举 State=t.Tuple[str,…] 位置=t.Tuple[int,int] 类方向TR,枚举: 向上 向下 左=左 右=右 def获取位置状态:状态->位置: o_索引=[x,y代表x,y代表y处于枚举状态的行,如果项==o,则为枚举行中的项] 断言leno_索引==1,必须正好有一个o。 返回o_指数[0] def movestate:状态,方向:方向->状态: x、 y=old\u x,old\u y=get\u positionstate 如果方向==向下: x+=1 elif方向==向上: x-=1 elif方向==右侧: y+=1 elif方向==左: y-=1 断言移动的有效性:
断言0字符串和元组在Python中是不可变的。你能用列表来代替状态吗?然后,您可以轻松地分配给各个元素。字符串和元组在Python中是不可变的。你能用列表来代替状态吗?然后你可以很容易地分配到各个元素。疯狂,非常感谢!!你能给我解释一下re.sub里面的东西吗,或者给我发一个解释链接吗?我需要在不同的情况下这样做,也需要向左移动example@Orsons:我
建议先阅读,然后用疯狂来理解这个特殊的模式,非常感谢!!你能给我解释一下re.sub里面的东西吗,或者给我发一个解释链接吗?我需要在不同的情况下这样做,也需要向左移动example@Orsons:我建议首先阅读,然后使用来理解这个特殊的模式状态显然是一个元组。由于元组是不可变的,您的解决方案将不起作用。另外,变量l是从哪里来的?state显然是一个元组。由于元组是不可变的,您的解决方案将不起作用。还有,变量l是从哪里来的?谢谢你的详细回答!它帮了我很多,我只是忘了给它投票。。。对不起,谢谢你详细的回答!它帮了我很多,我只是忘了给它投票。。。很抱歉