python .format()重复的字段?

时间:2013-01-05 05:07:51

标签: python python-3.x

我知道在python3中,你可以做类似的事情:

>>> '{0} {1} {0}'.format(13, 42)
'13 42 13'

所以你多次使用相同的参数。我想做相反的事情。我有一系列数字。我想以某种方式使用单个格式说明符打印它们,但我没有看到一种方法来向format语法指示给定标识符应该使用下一个N个参数。我可以使用reduce

>>> reduce(lambda out,x: out + '{:02X}'.format(x), b'\x60\x0d\x1a\xdd', '')
'600D1ADD'

但我希望能进行单一格式的调用,因为我想在其他格式化的序列中放置一些其他字符。

3 个答案:

答案 0 :(得分:4)

没有任何办法可以做到这一点。您可以做的是预先格式化您的数字列表,然后将该格式化的字符串作为单个项目传递给第二轮格式:

>>> nums = (13, 42)
>>> '{0} is {1}'.format('my stuff', ''.join('{:02X}'.format(a) for a in nums))
'my stuff is 0D2A'

如果您愿意,可以编写一个自定义Formatter子类,该子类接受一系列数字作为要格式化的单个项目,并将它们一起格式化。这可以让我做myFormatter.format('{0} is {1:list}', 'my stuff', (13, 42))之类的事情。以下是它的工作原理:

class ListFormatter(string.Formatter):
    def format_field(self, value, spec):
        if spec == 'list':
            return ''.join('{:02X}'.format(a) for a in value)
        else:
            return super(ListFormatter, self).format_field(value, spec)

>>> lf = ListFormatter()
>>> lf.format('{0} is {1:list}', 'my stuff', [1, 43])
'my stuff is 012B'

答案 1 :(得分:4)

这样的事情怎么样:

list = [13, 14, 42, 43]
out = ''.join([ '{0}'.format(x) for x in list ])

答案 2 :(得分:2)

我在这些方面使用了一些东西:

>>> list = [13, 14, 42, 43]
>>> ('0x' + len (list) * '{:02X}') .format (*list)
'0x0D0E2A2B'