python字符串格式化操作

时间:2009-08-05 08:04:11

标签: python string formatting

错误的代码:

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 位数的intigers,在整数值前面有一个额外的空格(我将其标记为 _ ):

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

另外,我想知道是否有办法添加Mapping键?

3 个答案:

答案 0 :(得分: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)

答案 1 :(得分:1)

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

应该做你需要的事情

此外:

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

将max_width而不是13放在上面并将所有字符串放在一个数组中(这对我来说比拥有一堆变量更有用)。

额外的讨厌: (使用数组来更接近你的问题。)

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

谁说Perl是唯一容易产生题词的语言?如果regexps是复杂代码的教父,那么列表理解就是教母。

(我对python相对较新,并且相信某些地方必须有一个max-function,这会降低上面的复杂性....好吧,检查,有。可惜,必须减少这个例子。 )

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

请注意以下评论“不在外部列表理解中计算不变量(最大值)”。

答案 2 :(得分:1)

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

我认为你的意思是那样的'%(mykey)d'%{'mykey':3} ,对吧?!我认为如果你使用“%* d”语法就不能使用它,因为没有办法用dict提供必要的宽度参数。

但为什么不动态生成格式字符串:

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

这样你就可以将宽度问题与实际值的格式分开,并且你可以为后者使用元组或字典,因为它适合你。