Python 字符串格式化操作

0 投票
3 回答
2178 浏览
提问于 2025-04-15 13:23

错误的代码:

pos_1 = 234
pos_n = 12890
min_width = len(str(pos_n)) # is there a better way for this?

# How can I use min_width as the minimal width of the two conversion specifiers?
# I don't understand the Python documentation on this :(
raw_str = '... from %(pos1)0*d to %(posn)0*d ...' % {'pos1':pos_1, 'posn': pos_n}

需要的输出:

... from 00234 to 12890 ...

           ______________________EDIT______________________

新的代码:

# I changed my code according the second answer
pos_1 = 10234 # can be any value between 1 and pos_n
pos_n = 12890
min_width = len(str(pos_n))

raw_str = '... from % *d to % *d ...' % (min_width, pos_1, min_width, pos_n)

新问题:

在整数值前面有一个多余的空格(我用_标记了它),对于那些位数为min_width的整数:

print raw_str
... from _10234 to _12890 ...

另外,我想知道有没有办法添加映射键?

3 个回答

1

关于在'%'后面使用映射类型作为第二个参数:

我猜你是指像这样 '%(mykey)d' % {'mykey': 3},对吧?!我觉得如果你使用"%*d"这种写法,就不能这样做,因为没有办法用字典提供所需的宽度参数。

但是为什么不动态生成你的格式字符串呢:

fmt = '... from %%%dd to %%%dd ...' % (min_width, min_width)
# assuming min_width is e.g. 7 fmt would be: '... from %7d to %7d ...'
raw_string = fmt % pos_values_as_tuple_or_dict

这样你就可以把宽度的问题和实际值的格式化分开处理,而且你可以根据需要使用元组或字典来处理后者。

1
"1234".rjust(13,"0")

这段代码应该能满足你的需求。

补充说明:

a = ["123", "12"]    
max_width = sorted([len(i) for i in a])[-1]

把上面提到的13换成max_width,然后把你所有的字符串放到一个数组a里(我觉得这样比用一堆变量要方便得多)。

还有一些麻烦的地方: (用数字数组来更接近你的问题。)

a = [123, 33, 0 ,223]
[str(x).rjust(sorted([len(str(i)) for i in a])[-1],"0") for x in a]

谁说只有Perl语言能轻松生成脑图?如果正则表达式是复杂代码的教父,那么列表推导就是教母。

(我对Python还比较陌生,但我相信应该有一个最大值函数可以用在数组上,这样可以简化上面的复杂度。……好吧,查了一下,确实有。可惜,我得简化这个例子。)

[str(x).rjust(max([len(str(i) for i in a]),"0") for x in a]

请注意下面关于“不要把不变值(最大值)的计算放在外层列表推导中的评论。”

2

这段代码是用来处理一些数据的。它的主要作用是从一个地方获取信息,然后对这些信息进行一些操作,最后再把结果放到另一个地方。

具体来说,代码里可能会有一些循环和条件判断,这些都是为了确保程序能够根据不同的情况做出相应的处理。比如,如果数据符合某个条件,就执行某个特定的操作;如果不符合,就可能执行另一个操作。

总的来说,这段代码的目的是让计算机能够自动化地完成一些任务,减少人工干预,提高效率。

pos_1 = 234
pos_n = 12890
min_width = len(str(pos_n))

raw_str = '... from %0*d to %0*d ...' % (min_width, pos_1, min_width, pos_n)

撰写回答