将Python字符串格式化与列表一起使用


111

s在Python 2.6.5中构造了一个字符串,该字符串将具有不同数量的%s令牌,这些令牌与list中的条目数匹配x。我需要写出格式化的字符串。以下内容不起作用,但表示我要执行的操作。在此示例中,有三个%s标记,并且列表具有三个条目。

s = '%s BLAH %s FOO %s BAR'
x = ['1', '2', '3']
print s % (x)

我希望输出字符串为:

1 BLAH 2 FOO 3 BAR

Answers:


112
print s % tuple(x)

代替

print s % (x)

5
(x)和一样x。在Python中,将单个标记放在方括号中没有意义。您通常将括号放在foo = (bar, )以使其更易于阅读,但功能foo = bar,却完全相同。
糕点

11
print s % (x)是OP写的,我只是引用他/她。
红外线

我只是提供一个语言提示,而不是批评您的答案(实际上我对此+1了)。你没有写foo = (bar, ) :)
尝试

2
(x)为了清楚起见,我使用该符号。如果以后再添加其他变量,它也可以避免忘记括号。
SabreWolfy 2011年

如果要从多个列表中获取变量该怎么办?元组只包含一个列表,而格式化程序似乎只包含一个列表
errant.info 2014年

150

您应该看一下python 的format方法。然后,您可以像这样定义格式字符串:

>>> s = '{0} BLAH BLAH {1} BLAH {2} BLAH BLIH BLEH'
>>> x = ['1', '2', '3']
>>> print s.format(*x)
'1 BLAH BLAH 2 BLAH 3 BLAH BLIH BLEH'

1
OP的问题不是方法,而是参数的格式。%操作员只打开元组的包装。
尝试

这将使构造s更加复杂,因为我需要包括递增数字,而不是仅%s针对每个位置。s是通过许多不同的步骤构建的,因此仅包含%s令牌就容易得多。
SabreWolfy 2011年

2
@SabreWolfy如果您按顺序构造它,则可能会发现更容易命名占位符并使用dict格式化结果字符串:print u'%(blah)d BLAHS %(foo)d FOOS …' % {'blah': 15, 'foo': 4}
2011年

2
@SabreWolfy:在Python 2.7中,您可以省略字段编号:s = '{} BLAH {} BLAH BLAH {} BLAH BLAH BLAH'
已暂停,直到另行通知。

这个答案可能会造成混淆,因为它看起来像数字0、1和2都与单词“ BLAH”出现的次数有关。
SabreWolfy

31

在此资源页面之后,如果x的长度变化,我们可以使用:

', '.join(['%.2f']*len(x))

为列表中的每个元素创建一个占位符x。这是示例:

x = [1/3.0, 1/6.0, 0.678]
s = ("elements in the list are ["+', '.join(['%.2f']*len(x))+"]") % tuple(x)
print s
>>> elements in the list are [0.33, 0.17, 0.68]

1
现在链接已死。
MK猎人,

19

这是一个班轮。一个临时的答案,使用带有print()的format来迭代列表。

怎么样(Python 3.x):

sample_list = ['cat', 'dog', 'bunny', 'pig']
print("Your list of animals are: {}, {}, {} and {}".format(*sample_list))

在此处阅读有关使用format()的文档。


18

由于我刚刚学到了这个很酷的东西(从格式字符串中索引到列表中),所以我添加了这个老问题。

s = '{x[0]} BLAH {x[1]} FOO {x[2]} BAR'
x = ['1', '2', '3']
print (s.format (x=x))

输出:

1 BLAH 2 FOO 3 BAR

但是,我仍然没有弄清楚如何进行切片(在格式字符串'"{x[2:4]}".format...中),并且很想弄清楚是否有人有想法,但是我怀疑您根本无法做到这一点。


我对您的切片用例有点好奇。
迈克尔(Michael)

1
我真的没有一个……我想我只是认为能够做到这一点很整齐
Joran Beasley,

11

这是一个有趣的问题!处理可变长度列表的另一种方法是构建一个充分利用该.format方法和列表拆包的功能。在下面的示例中,我不使用任何特殊的格式,但是可以轻松地对其进行更改以满足您的需求。

list_1 = [1,2,3,4,5,6]
list_2 = [1,2,3,4,5,6,7,8]

# Create a function that can apply formatting to lists of any length:
def ListToFormattedString(alist):
    # Create a format spec for each item in the input `alist`.
    # E.g., each item will be right-adjusted, field width=3.
    format_list = ['{:>3}' for item in alist] 

    # Now join the format specs into a single string:
    # E.g., '{:>3}, {:>3}, {:>3}' if the input list has 3 items.
    s = ','.join(format_list)

    # Now unpack the input list `alist` into the format string. Done!
    return s.format(*alist)

# Example output:
>>>ListToFormattedString(list_1)
'  1,  2,  3,  4,  5,  6'
>>>ListToFormattedString(list_2)
'  1,  2,  3,  4,  5,  6,  7,  8'

3

与@neobot的答案相同,但更加现代和简洁。

>>> l = range(5)
>>> " & ".join(["{}"]*len(l)).format(*l)
'0 & 1 & 2 & 3 & 4'

0
x = ['1', '2', '3']
s = f"{x[0]} BLAH {x[1]} FOO {x[2]} BAR"
print(s)

输出是

1 BLAH 2 FOO 3 BAR
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.