我最近(终于?)开始使用.format()
和
对它有一个可能有点模糊的问题。
鉴于
res = ['Irene Adler', 35, 24.798]
和
(1) print('{0[0]:10s} {0[1]:5d} {0[2]:.2f}'.format(res))
(2) print('{:{}s} {:{}d} {:{}f}'.format(res[0], 10, res[1], 5, res[2], .2))
工作得很好并打印:
Irene Adler 35 24.80
Irene Adler 35 24.80
我不知道我可以像(1)那样处理清单。一世
我之前看到过带有旧%
格式的字段宽度参数(2)。
我的问题是想要做这样的事情,它结合了(1)和(2):
(3) print('{0[0]:{}s} {0[1]:{}d} {0[2]:{}f}'.format(res, 10, 5, .2))
然而,我无法做到这一点,我无法弄明白 如果可能的话,从文档中。真的很好 提供要打印的列表,以及宽度的参数。
顺便说一句,我也试过这个(没有运气):
args = (10, 5, .2)
(4) print('{0[0]:{}s} {0[1]:{}d} {0[2]:{}f}'.format(res, args))
在这两种情况下我得到了:
D:\Users\blabla\Desktop>python tmp.py
Traceback (most recent call last):
File "tmp.py", line 27, in <module>
print('{0[0]:{}s} {0[1]:{}d} {0[2]:{}f}'.format(res, 10, 5, .2))
ValueError: cannot switch from manual field specification to automatic field numbering
D:\Users\blabla\Desktop>python tmp.py
Traceback (most recent call last):
File "tmp.py", line 35, in <module>
print('{0[0]:{}s} {0[1]:{}d} {0[2]:{}f}'.format(res, args))
ValueError: cannot switch from manual field specification to automatic field numbering
我也尝试使用zip()
来组合这两个序列而没有运气。
我的问题是:
我可以指定一个列表,以便有效地打印我正在尝试的内容 在(3)和(4)中没有成功(显然,如果这是可能的,我是 没有使用正确的语法)如果是这样,怎么样?
答案 0 :(得分:62)
错误消息
ValueError: cannot switch from manual field specification to automatic field numbering
几乎说明了一切:你需要在任何地方提供明确的字段索引,并且
print('{0[0]:{1}s} {0[1]:{2}d} {0[2]:{3}f}'.format(res, 10, 5, .2))
工作正常。
答案 1 :(得分:2)
如果您想使用.format(res, args)
,您可以在格式字符串中指定所有索引:
>>> print('{0[0]:{1[0]}s} {0[1]:{1[1]}d} {0[2]:{1[2]}f}'.format(res, args))
Irene Adler 35 24.80
但是,如果你想制作没有索引的格式字符串,你可以创建一个连续对(res[0], args[0], ... , res[-1], args[-1])
的元组。
这是由这个习语完成的:
>>> sum(zip(res, args), ())
('Irene Adler', 10, 35, 5, 24.798, 0.2)
您现在可以将其传递为简化格式字符串(通过*
- 参数):
>>> fmt = sum(zip(res, args), ())
>>> print('{:{}s} {:{}d} {:{}f}'.format(*fmt))
('Irene Adler', 10, 35, 5, 24.798, 0.2)
当然,这可以在一行上完成:
>>> print('{:{}s} {:{}d} {:{}f}'.format(*sum(zip(res, args), ())))
Irene Adler 35 24.80
为了使其可读,我将命名转换:
def flat_pairs(iterable1, iterable2):
return sum(zip(iterable1, iterable2), ())
# (...)
>>> print('{:{}s} {:{}d} {:{}f}'.format(*flat_pairs(res, args)))
Irene Adler 35 24.80
我认为最后一个是在可读性,便利性和当然之间进行合理的权衡 - 炫耀你的Pythonic思维方式,这是玩这类东西的主要动机。