对列表使用Python字符串格式
我在Python2.6.5中构造了一个字符串对列表使用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) 您
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