Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 3.x 在特定位置替换特定字符而不使用循环-Python_Python 3.x_String - Fatal编程技术网

Python 3.x 在特定位置替换特定字符而不使用循环-Python

Python 3.x 在特定位置替换特定字符而不使用循环-Python,python-3.x,string,Python 3.x,String,我试图替换字符串中特定位置的特定字符 这需要在不使用for循环和函数的情况下完成 下面是一个示例-需要将第5个字符替换为x s=0123456789012345689 输出需要为-01234x67890x23456x89 我尝试过替换、拆分,但可能是我没有在正确的上下文中使用它们。字符串可能有n个字符长,因此我无法硬编码在哪里获得特定位置并将其分解为子字符串。字符串在python中应该是不可变的,那么还有其他选择吗 任何帮助都将不胜感激。谢谢 试试看 s = "01234567890123456

我试图替换字符串中特定位置的特定字符

这需要在不使用for循环和函数的情况下完成

下面是一个示例-需要将第5个字符替换为x s=0123456789012345689 输出需要为-01234x67890x23456x89 我尝试过替换、拆分,但可能是我没有在正确的上下文中使用它们。字符串可能有n个字符长,因此我无法硬编码在哪里获得特定位置并将其分解为子字符串。字符串在python中应该是不可变的,那么还有其他选择吗

任何帮助都将不胜感激。谢谢

试试看

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这太棒了。这就是我要找的。谢谢。