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