2014-02-18 25 views
3

我有一个多行字符串,我想用自己的变量改变它的某些部分。我真的不喜欢用+运算符拼凑相同的文本。有更好的选择吗?在Python中格式化多行字符串的最优雅的方式

例如(内部引号是必需的):

line = """Hi my name is "{0}". 
I am from "{1}". 
You must be "{2}".""" 

我希望能够利用这个多次以形成一个较大的字符串,这将是这样的:

Hi my name is "Joan". 
I am from "USA". 
You must be "Victor". 

Hi my name is "Victor". 
I am from "Russia". 
You must be "Joan". 

是有没有办法做这样的事情:

txt == "" 
for ...: 
    txt += line.format(name, country, otherName) 

回答

4
info = [['ian','NYC','dan'],['dan','NYC','ian']] 
>>> for each in info: 
    line.format(*each) 


'Hi my name is "ian".\nI am from "NYC".\nYou must be "dan".' 
'Hi my name is "dan".\nI am from "NYC".\nYou must be "ian".' 

星号运算符将将列表解压缩到format方法中。

1
line = """Hi my name is "{0}". 
I am from "{1}". 
You must be "{2}".""" 

tus = (("Joan","USA","Victor"), 
     ("Victor","Russia","Joan")) 

lf = line.format # <=== wit, direct access to the right method 

print '\n\n'.join(lf(*tu) for tu in tus) 

结果

Hi my name is "Joan". 
I am from "USA". 
You must be "Victor". 

Hi my name is "Victor". 
I am from "Russia". 
You must be "Joan". 
2

除了列表中,您还可以使用字典。如果你有很多变量需要一次跟踪,这很有用。

text = """\ 
Hi my name is "{person_name}" 
I am from "{location}" 
You must be "{person_met}"\ 
""" 
person = {'person_name': 'Joan', 'location': 'USA', 'person_met': 'Victor'} 

print text.format(**person) 

请注意,我输入文本的方式不同,因为它可以让我更容易地排列文本。你必须在开头的“”“和结尾的”“”之前添加一个'\'。

现在,如果你在列表中有几本词典,你可以很容易地做到

people = [{'person_name': 'Joan', 'location': 'USA', 'person_met': 'Victor'}, 
      {'person_name': 'Victor', 'location': 'Russia', 'person_met': 'Joan'}] 

alltext = "" 
for person in people: 
    alltext += text.format(**person) 

或使用列表理解

alltext = [text.format(**person) for person in people] 
相关问题