【问题标题】:python String Formatting Operationspython字符串格式化操作
【发布时间】:2009-08-05 08:04:10
【问题描述】:

错误代码:

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 ...

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

【问题讨论】:

    标签: python string formatting


    【解决方案1】:
    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)
    

    【讨论】:

    • 恕我直言,您不需要填充第二个数字 - 它已经具有最小宽度
    • 是的,尽管如果代码被修改为采用两个数字中较长的一个(如果 pos_1 可能是负数并因此需要额外的否定字符,这可能是必要的)它会更安全通过两个宽度。
    • 谢谢,到目前为止!在将填充字符从 0 更改为 whitespace 后,我遇到了新的麻烦。如果你能看看我的新例子,我会很高兴。
    • 要填充空格,只需使用 %*d - 实际上不要在 % 和 * 之间放置空格,否则它确实会出错。
    • % *d 习惯用法很有趣,如果你混合正数和负数,并希望它们很好地对齐,所以 Python 在正数之前留下一个空白,并且在底片的前面,都占用相同的空间。
    【解决方案2】:

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

    我猜你的意思是类似 '%(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。虽然这很有趣,但是这不是让“坚持使用 %-operator”变得有点不可读吗?不过,这有点酷,如果可能不是可取的。
    • 您总是可以将最终的输出字符串分解成更小、更易于管理的部分,单独处理它们(使用 '%' 或 .rjust 或任何有效的方法),然后从这些子字符串中组成最终字符串.然后像 widthfmt="%d" % min_width; fieldfmt="%" + widthfmt + "d" 看起来不那么令人生畏。
    【解决方案3】:
    "1234".rjust(13,"0")
    

    应该做你需要的

    补充:

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

    用 max_width 代替上面的 13 并将所有字符串放在一个数组 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 比较陌生,并且相当确信在某处的数组上必须有一个 max-function,这将降低上述复杂性。....好的,检查过,有。可惜,必须减少示例。 )

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

    请注意下面的 cmets 关于“不在外部列表理解中计算不变量(最大值)”。

    【讨论】:

    • 谢谢,我将使用您关于阵列的建议。关于 rjust:目前,我需要了解字符串格式化的 % 运算符,这就是我绑定它的原因。抱歉,应该提到这一点。
    • 您真的很想在执行 .rjust() 列表之前中断 max() 计算并将其捕获到变量中。否则,您将重新计算外部列表中 每个 项的内部列表和 max() 值! (但是您对列表推导的一般评论很好:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-11-28
    • 2011-07-28
    • 1970-01-01
    • 1970-01-01
    • 2021-11-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多