Python 3.x 在特定位置替换特定字符而不使用循环-Python
我试图替换字符串中特定位置的特定字符 这需要在不使用for循环和函数的情况下完成 下面是一个示例-需要将第5个字符替换为x s=0123456789012345689 输出需要为-01234x67890x23456x89 我尝试过替换、拆分,但可能是我没有在正确的上下文中使用它们。字符串可能有n个字符长,因此我无法硬编码在哪里获得特定位置并将其分解为子字符串。字符串在python中应该是不可变的,那么还有其他选择吗 任何帮助都将不胜感激。谢谢 试试看Python 3.x 在特定位置替换特定字符而不使用循环-Python,python-3.x,string,Python 3.x,String,我试图替换字符串中特定位置的特定字符 这需要在不使用for循环和函数的情况下完成 下面是一个示例-需要将第5个字符替换为x s=0123456789012345689 输出需要为-01234x67890x23456x89 我尝试过替换、拆分,但可能是我没有在正确的上下文中使用它们。字符串可能有n个字符长,因此我无法硬编码在哪里获得特定位置并将其分解为子字符串。字符串在python中应该是不可变的,那么还有其他选择吗 任何帮助都将不胜感激。谢谢 试试看 s = "01234567890123456
s = "01234567890123456789012345"
pieces = []
for i in range((len(s)-1)//5):
pieces.append(s[i*6:i*6+5])
result = 'x'.join(pieces)
assert(result == '01234x67890x23456x89012x45')
我们对字符串中六个字符的每个窗口进行迭代,然后收集每个窗口中的前五个字符。然后使用字符串x作为分隔符,将所有窗口连接在一起
为了避免使用循环,可以将上述内容转换为列表。我将这一步留给您完成。我想,如果您严格希望避免for循环,最简单的方法是转换为列表,替换项,然后再转换回 这将是:
s = "0123456789012345689"
lst = list(s) # result: ['0', '1', '2', ..., '9']
lst[0:-1:5] = ["x"]*len(lst[0:-1:5])
结果是:
In [43]: lst
Out[43]:
['x',
'1',
'2',
'3',
'4',
'x',
'6',
'7',
'8',
'9',
'x',
'1',
'2',
'3',
'4',
'x',
'6',
'8',
'9']
要将其恢复为字符串,只需使用连接:
In [44]: "".join(lst)
Out[44]: 'x1234x6789x1234x689
第lst[0:-1:5]部分选择列表中的每5个元素,从第一个条目开始,以0:表示。如果希望从第5个元素开始,只需执行lst[5:-1:5]。-1部分的意思是直到最后,最后:5代表五分之一
需要使用[x]*lenlst[0:-1:5]赋值,因为这里的x将尝试为原始列表中长度为lenlst[0:-1:5]的部分赋值,因为这正是我们首先选择的项目数
编辑:
再看一下,预期的结果实际上是每6个字符更改一次,而不是每5个字符更改一次,同时在原始字符串中更改的字符之间保留5个字符
当然,需要调整切片以选择每6个字符:
lst[5:-1:6] = ["x"]*len(lst[5:-1:6])
^ ^
结果:
In [12]: "".join(lst)
Out[12]: '01234x67890x23456x9'
现在,每六个字符都将被替换,同时保留原始字符串中间的五个字符。我的解决方案是: def更换位置信息,更换,n: lis=listmessage获取所有字符的列表。 lis.popn从列表中删除所选字符。 lis.insertn,更换,在指定位置更换。 返回joinlis 示例用法: >>>a='你好,世界,第6个字符是x!' >>>替换位置A,'x',6 “你好,xorld,第6个字符是x!” 然而,这只会得到该位置的第一个。为了做到这一点,我将这样做: def更换位置信息,更换,n: lis=列表消息 对于rangen中的i,lenmessage,n+1: 波皮李 李氏插入物,替代物 返回joinlis 唯一的区别是,我们现在正在迭代整个消息,并在执行过程中替换每个消息。类似用途: >>>a=‘你好,世界,每6个字符都是x!’ >>>更换位置A,'x',6 “你好,xorld,非常6xh charxcter ix和x!”
希望这能有所帮助。为什么要列出如此任意的条件?这是家庭作业吗?从技术上讲,Python中的所有东西在某种程度上都是函数,for循环也是循环。也许你想展示你的代码,以便我们知道你做错了什么?这与OP的预期输出不太匹配。每五个字符应设置为x,而不是索引为5的倍数的每个字符。@Brian这是完全相同的,您只需将索引更改为lst[5:-1:5],如本文所述。我从第一个条目开始制作示例,即lst[0:-1:5],仅出于解释原因:以lst[5:-1:5]为例,它将给出所需的输出,让初学者不知道哪个5负责哪个操作。我建议您将此技术的输出与更新01234x6789x1234x689进行比较,具有OP的预期值01234x67890x23456x89。你想访问每六个元素,在每个分隔符之间留五个字符。@Brian啊,是的,我被每五个字符误导了。结果实际上保留了5个字符,然后更改了第6个字符。无论如何,解决方案仍然有效。这只会将索引更改为lst[5:-1:6],仅此而已。@daniel451这太棒了。这就是我要找的。谢谢。