对列表使用Python字符串格式

对列表使用Python字符串格式,python,string,list,formatting,string-formatting,Python,String,List,Formatting,String Formatting,我在Python2.6.5中构造了一个字符串s,它将具有不同数量的%s标记,这些标记与列表x中的条目数量相匹配。我需要写出一个格式化的字符串。下面的代码不起作用,但表明了我正在尝试做的事情。在本例中,有三个%s标记,列表中有三个条目 s = '%s BLAH %s FOO %s BAR' x = ['1', '2', '3'] print s % (x) 我希望输出字符串为: 1 BLAH 2 FOO 3 BAR print s % tuple(x) 而不是 print s % (x) 您

我在Python2.6.5中构造了一个字符串
s
,它将具有不同数量的
%s
标记,这些标记与列表
x
中的条目数量相匹配。我需要写出一个格式化的字符串。下面的代码不起作用,但表明了我正在尝试做的事情。在本例中,有三个
%s
标记,列表中有三个条目

s = '%s BLAH %s FOO %s BAR'
x = ['1', '2', '3']
print s % (x)
我希望输出字符串为:

1 BLAH 2 FOO 3 BAR

print s % tuple(x)
而不是

print s % (x)

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

>>> 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'
接下来,如果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]

因为我刚刚了解了这个很酷的东西(从一个格式字符串中索引到列表),所以我要补充这个老问题

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
方法和列表解包。在下面的示例中,我不使用任何花哨的格式,但是可以很容易地进行更改以满足您的需要

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'

这是一条单行线。一个小的即兴回答,使用print()格式迭代列表。

这个(Python3.x)怎么样:


阅读这里关于使用的文档

与@neobot的答案相同,但更现代、更简洁

>>l=范围(5)
>>>“&”.join([“{}”]*len(l)).format(*l)
'0 & 1 & 2 & 3 & 4'
输出是

1 BLAH 2 FOO 3 BAR

OP的问题不是方法,而是参数的格式
%
运算符仅解压元组。这将使
s
的构造更加复杂,因为我需要为每个位置包含递增的数字,而不是简单的
%s
<代码>s是在许多不同的步骤中构建的,因此只包含
%s
标记要容易得多。@SabreWolfy如果预先构造它,那么您可能会发现命名占位符并使用dict格式化结果字符串更容易:
打印u'(blah)d BLAHS%(foo)d FOOS…'%{blah':15,'foo':4}
@SabreWolfy:在Python2.7中,您可以省略字段号:
s='{}BLAH{}BLAH{}BLAH BLAH BLAH'
@kotchwane:the*函数是一个特殊的Python关键字,用于将作为列表的参数转换为参数列表:)。在我们的例子中,*x将把x的3个成员传递给format方法。
(x)
x
是一样的。在Python中,将单个标记放在括号中没有任何意义。你通常会在
foo=(bar,)
中加括号,以便于阅读,但
foo=bar,
做的事情完全一样。
print s%(x)
是OP写的,我只是引用他/她。我只是提供了一个语言提示,而不是批评你的答案(事实上我+1)。您也没有编写
foo=(bar,)
:)为了清晰起见,我使用了
(x)
符号;如果您以后添加其他变量,它还可以避免忘记括号。如果您想从多个列表中获取变量,该如何处理?元组只需要一个列表,而格式化程序似乎只需要一个元组我有点好奇你的切片用例。我真的没有一个。。。我想我只是想知道星号(*)的含义或功能是什么会很好?您指向文档的链接似乎没有阐明这一点。@kotchwane星号将列表“展开”为单个有序参数。f(*x)==f(x[0],x[1],…,x[n])。类似地,两个星号(**)将dict扩展为关键字参数。
x = ['1', '2', '3']
s = f"{x[0]} BLAH {x[1]} FOO {x[2]} BAR"
print(s)
1 BLAH 2 FOO 3 BAR