如何在python中格式化字符串以使用列表

时间:2018-08-08 23:25:00

标签: python formatting multiline

我有以下代码:

import textwrap
text_string = "This is a long string that goes beyond 40 characters"

wrapper = textwrap.TextWrapper(width=40)
word_list = wrapper.wrap(text=text_string)
year = '2018'
pkg = 'textwrap'
new_string = """This is a new string formatted in {1} with {2} resulting in 
{3}""".format(year, pkg, *word_list)

如果我要运行这段代码,这就是我观察到的内容: {3}替换为word_list的第一个元素。由于我不知道word_list的大小,因此我希望{3}将列表的每个成员放在新的一行。字符串换行应为:

“”“这是2018年格式化的新字符串,其文本换行结果为 这是一个超过4的长字符串 0个字符“”“

但是它变成了 “”“这是一个新字符串,格式为2018,格式为textwrap 这是一个超出4的长字符串

我无法确定如何使用格式来完成此操作。我不尝试打印此文件,也不希望插入“ \ n”,因为此新字符串已添加到文件中,并且无法打印。

感谢您的帮助。

2 个答案:

答案 0 :(得分:0)

您可以在列表上调用join,将其转换为包含列表中所有元素(由定界符分隔)的字符串:

new_string = """This is a new string formatted in {1} with {2} resulting in 
{3}""".format(year, pkg, " ".join(word_list))

答案 1 :(得分:0)

如果我了解您的要求,那么有两种方法可以满足您的需求:

1。继续使用wrap调用返回列表

因此,我们仍在使用wrap方法返回列表,在这种情况下,我们只需要以以下格式构建字符串:将*args传递给格式(称为unpacking)需要已知长度。这样的:

import textwrap
text_string = "This is a long string that goes beyond 40 characters"

wrapper = textwrap.TextWrapper(width=40)
word_list = wrapper.wrap(text=text_string)

year = '2018'
pkg = 'textwrap'
new_string = """This is a new string formatted in {} with {} resulting in""".format(year,pkg)
new_string += str("\n{}" * len(word_list)).format(*word_list)

#originally had above using join but this method can increase performance if text is large
#join version: new_string = """This is a new string formatted in {} with {} resulting in \n{}""".format(year,pkg,"\n".join(word_list))


print(new_string)

我创建了基本字符串(new_string),然后用新字符串(\n{})对其进行了简化,我将其与列表word_list中的元素进行了多次乘法-创建了字符串中需要{}的数量,以使用未压缩的word_list格式。

2。使用“ fill”方法来构建一个包装好的字符串

注意:这里我使用字典,因为我个人认为将值传递给格式时比较干净,但是如果不需要,您可以改回来。

import textwrap
text_string = "This is a long string that goes beyond 40 characters"
#Using a dictionary to create a map for passing
results_dict = {
    "year": "2018",
    "pkg": "textwrap",
    "word_list": ""
}

wrapper = textwrap.TextWrapper(width=40)

results_dict["word_list"] = wrapper.fill(text=text_string)

new_string = """This is a new string formatted in {year} with {pkg} resulting in \n{word_list}""".format(**results_dict)
#using the **results_dict as a map just to show another method for format
print(new_string)

在这种情况下,fill只返回给定段落或句子的包装版本(字符串),因此我们只需要照常传递即可。

两者的输出:

This is a new string formatted in 2018 with textwrap resulting in
This is a long string that goes beyond
40 characters