使用lis替换字符串中的子字符串

2024-09-28 19:31:48 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在寻找一种更python的方法,用列表中的值替换字符串中已知长度的占位符。应按顺序更换,且只能使用一次。例如,使用以下值:

replaceVals = ['foo', 'bar']

origStr = 'I went to the ? to get ?'

我希望得到:

^{pr2}$

我可以通过下面的循环获得所需的结果,但我觉得应该有一个更好的方法来实现这一点,而不是使用这样的循环。在

for i in range(len(replaceVals)):
   origStr = origStr.replace('?', replaceVals[i], 1)

Tags: theto方法字符串in列表forget
3条回答

可以使用字符串的replaceformat方法,如下所示:

origStr.replace('?','{}').format(*replaceVals)

Out[334]: 'I went to the foo to get bar'

这里有一个使用生成器的想法:

replaceVals = iter(['foo', 'bar'])
origStr = 'I went to the ? to get ?'

(' ').join(next(replaceVals) if i == '?' else i for i in origStr.split())

输出:

^{pr2}$

这样做的好处是replaceVals中的项数不必与origStr中要替换的项数匹配:

replaceVals = iter(['foo', 'bar', 'other'])
origStr = 'I went to the ? to get ?'

(' ').join(next(replaceVals) if i == '?' else i for i in origStr.split())
#'I went to the foo to get bar'

但是,在这些情况下使用字符串格式会导致错误。在

@roganjosh在评论中的回答可能是最好的,尽管这篇文章非常抽象,不清楚他的真实情况。我很好奇是否有人能用在Python3中出现的f弦来做这个。与@roganjosh相比,f-string没有@roganjosh更吸引人的是,通过.format()调用解包替换序列非常简单。也就是说,如果你想试试f-string,这样的方法就可以了:

replaceVals = ['foo', 'bar'] 
stream = iter(replaceVals)
f'I went to the {stream.next()} to get {stream.next()}'

相关问题 更多 >