Python 使用.format()格式化具有字段宽度参数的列表
我最近(终于?)开始使用Python 使用.format()格式化具有字段宽度参数的列表,python,list,string-formatting,Python,List,String Formatting,我最近(终于?)开始使用.format()和 我有一个可能有点模糊的问题 给定 及 工作很好,两种打印: Irene Adler 35 24.80 Irene Adler 35 24.80 我不知道我可以处理(1)中的列表,这很整洁。我 以前见过关于字段宽度参数(2)的旧%格式 我的问题是想做这样的事情,结合(1)和(2): 然而,我无法做到这一点,我还没有弄明白 如果可能,请参阅文档。只要 提供要打印的列表以及宽度参数 顺便说一下,我也试过这个(没有运气): 在这两种情况下,我都
.format()
和
我有一个可能有点模糊的问题
给定
及
工作很好,两种打印:
Irene Adler 35 24.80
Irene Adler 35 24.80
我不知道我可以处理(1)中的列表,这很整洁。我
以前见过关于字段宽度参数(2)的旧%
格式
我的问题是想做这样的事情,结合(1)和(2):
然而,我无法做到这一点,我还没有弄明白
如果可能,请参阅文档。只要
提供要打印的列表以及宽度参数
顺便说一下,我也试过这个(没有运气):
在这两种情况下,我都得到:
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
D:\Users\blabla\Desktop>python tmp.py
回溯(最近一次呼叫最后一次):
文件“tmp.py”,第27行,在
打印({0[0]:{}s}{0[1]:{}d}{0[2]:{}f})。格式(res,10,5,2))
ValueError:无法从手动字段规范切换到自动字段编号
D:\Users\blabla\Desktop>python tmp.py
回溯(最近一次呼叫最后一次):
文件“tmp.py”,第35行,在
打印({0[0]:{}s}{0[1]:{}d}{0[2]:{}f}。格式(res,args))
ValueError:无法从手动字段规范切换到自动字段编号
我还尝试使用zip()
来组合这两个序列,但运气不好
我的问题是:
我是否可以指定一个列表,以便按照我尝试的方式有效打印
在第(3)和(4)条中没有成功(显然,如果这是可能的,我
没有使用正确的语法)如果是,如何处理?错误消息
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))
工作正常。如果要使用
.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)
现在可以将其传递为简化格式字符串(通过*
-参数):
当然,这可以通过一行完成:
>>> 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
我认为最后一个问题是在可读性、方便性之间的合理权衡,当然还有——展示你的Python式思维方式,这是玩这些东西的主要动机。谢谢Sven,我不知道为什么我没有得到它。我还发现我可以这样做:
args=(10,5,2)
,然后print({0[0]:{1}s}{0[1]:{2}d}{0[2]:{3}f}。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
>>> 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