【问题标题】:Replace % followed by a number in a string替换 % 后跟字符串中的数字
【发布时间】:2015-02-17 15:29:12
【问题描述】:

我正在做一个班级作业,要求我将 % 后跟一个数字替换为其相应的位置参数(如果有的话,假设只给出了这些数字和必需的参数)。我已经尝试解决这个问题几个小时了无济于事。搜索了 Stack Overflow 和 web,但之前提出的问题只是用足够简单的东西替换了整数。

例如: formatting("Exodus %0" , "Moses") --> 应该返回 "Exodus Moses"

formatting("Exodus %0 and %1", "Kings","Gods") --> 应该返回 "Exodus Kings and Gods"

formatting("Exodus %1 and %0", "Kings","Gods") --> 应该返回 "Exodus Gods and Kings"

从外观上看,我认为函数格式化原型应该是

def formatting(inputstring, *args):

到目前为止我尝试过的事情

1.for 循环用其对应的参数天真地替换 %number

for length in len(args):
    temp=temp.replace("%length","arg[length]")        

当然这是行不通的,因为它们是字符串而不是整数

2.使用 inputstring.format() 返回所需的字符串。 问题是由不同的参数长度引起的 例如:

if len(args) == 1:    
    return inputstring.replace("%0",args[0])
if len(args) == 2:
    inputstring = inputstring.replace("%0",args[0])
    return inputstring.replace("%1",args[1])

很简单,它可以工作!但感觉不对,很多争论很麻烦 尝试循环执行此操作没有成功

请帮忙 谢谢!

【问题讨论】:

  • Python 肯定有打印语句已经自动完成了这种事情。在这里查看:docs.python.org/2/tutorial/inputoutput.html
  • 考虑enumerate(args)...
  • @RobertHarvey:可能,但这是一个作业,我猜他们希望学生手动完成
  • @RobertHarvey :我在该页面上能找到的最接近的是 str.format() ,它本质上想要嵌入形式为 {number} 而不是 %number 的字符串,尽管我可能错了我必须探索

标签: python arrays python-2.7 python-3.x formatting


【解决方案1】:

你几乎在这里拥有它:

for length in xrange(len(args)):
    temp = temp.replace("%length","arg[length]")

考虑:

>>> s = "Hello %length there %0 man"
>>> length = 0
>>> args = ["something"]

如果你做了你所做的替换,就会发生错误的事情:

>>> s.replace("%length", "args[length]")
'Hello args[length] there %0 man'

你想最终这样做:

>>> s.replace("%0", "something")
'Hello %length there something man'

如何做到这一点?对于给定的索引,您必须构造字符串"%",后跟索引,然后从args 中获取该值:

>>> i = 0
>>> "%" + str(i)
'%0'
>>> args[i]
'something'    
>>> s.replace("%" + str(i), args[i])
'Hello %length there something man'

所以你的循环必须是这样的:

>>> for i in xrange(len(args)):
        temp = temp.replace("%" + str(i), args[i])

或者,更Python地,您可以使用enumerate,它可以让您遍历一个列表并同时获取索引:

>>> for i, arg in enumerate(args):
        temp = temp.replace("%" + str(i), arg)

【讨论】:

  • 使用 enumerate 而不是遍历索引:for idx, val in enumerate(args): temp = temp.replace("%{0}".format(idx), val)
  • 如果 args 的数量超过 9,这将有问题。
  • @Daniel:我意识到,但我将其保持在初学者水平。我想我可以添加一个“高级”部分..
  • @Claudiu:啊,完美,你成功了!谢谢你,这让我发疯了。关于参数计数是否大于单个数字的任何想法?
  • @solinvictus:我会说这是规范的问题,但您可以反向迭代:for i, arg in reversed(enumerate(args)):。这样,较大的数字会先被替换,而不会被较小的数字混淆。
猜你喜欢
  • 2020-09-30
  • 1970-01-01
  • 2010-10-13
  • 2012-04-26
  • 1970-01-01
  • 2021-12-20
  • 2020-12-16
  • 2014-09-20
相关资源
最近更新 更多