使用字符串模板时如何在单行中附加所有循环元素?

How to append all the loop elements in single line while using string Template?

我试图通过使用字符串模板为 example.py 创建一个模板,其中我将每个替换为 $i ["CA:"+$i[=37= 中的循环元素]+':'+" "]。部分有效,但仅替换最后一个元素。

但是,我想以特定格式在单行中附加所有值。

例如:

我当前的脚本如下:

for i in range(1,4):
    #It takes each "i" elements and substituting only the last element
    str='''s=selection( self.atoms["CA:"+$i+':'+" "].select_sphere(10) )

我得到的结果如下:

    s=selection( self.atoms["CA:"+3+':'+" "].select_sphere(10) )

什么,我期待的是:

    s=selection ( self.atoms["CA:"+1+':'+" "].select_sphere(10),self.atoms["CA:"+2+':'+" "].select_sphere(10),self.atoms["CA:"+3+':'+" "].select_sphere(10) )

我的脚本:

import os
from string import Template
for i in range(1,4):

    str='''
    s=selection( self.atoms["CA:"+$i+':'+" "].select_sphere(10) )
    '''
    str=Template(str)
    file = open(os.getcwd() + '/' + 'example.py', 'w')
    file.write(str.substitute(i=i))
    file.close()

我使用这两个脚本来获得我想要的输出:

import os
from string import Template
a=[]
for i in range(1,4):
     a.append(''.join("self.atoms["+ "'CA:' "+str(i)+""':'+" "+"]"+".select_sphere(10)"))

str='''s=selection( $a ).by_residue()'''
str=Template(str)
file = open(os.getcwd() + '/' + 'example.py', 'w')
file.write(str.substitute(a=a))

with open('example.py', 'w') as outfile:
     selection_template = '''self.atoms["CA:"+{}+':'+" "].select_sphere(10)'''
     selections = [selection_template.format(i) for i in range(1, 4)]
     outfile.write('s = selection({})\n'.format(', '.join(selections)))

一个问题是您的代码,因为它以 'w' 模式打开输出文件,所以在 for 循环的每次迭代中都会覆盖该文件。这就是为什么您只能看到文件中的最后一个。

我也不会使用 string.Template 来执行这些替换。只需使用 str.format(). Generate a list of selections and use str.join() 生成最终字符串:

with open('example.py', 'w') as outfile:
    selection_template = 'self.atoms["CA:"+{}+":"+" "].select_sphere(10)'
    selections = [selection_template.format(i) for i in range(1, 4)]
    outfile.write('s = selection({})\n'.format(', '.join(selections)))

此处 selection_template 使用 {} 作为变量替换的占位符,并使用列表理解来构造选择字符串。然后使用字符串 ', ' 作为分隔符将这些选择字符串连接在一起,并将结果字符串插入对 selection() 的调用中,再次使用 str.format().

本例中我使用了Python内置的format字符串方法,比较容易理解。如果您更喜欢使用字符串模板,您可以轻松调整它。

诀窍是观察有两个单独的操作要执行:

  1. 创建参数列表
  2. 替换所需输出行中的参数列表

我使用 join 的生成器表达式参数来实现必要的迭代和第 1 部分,然后使用简单的字符串格式化来完成第 2 步。

我使用字符串的 format 方法作为绑定函数,通过缩写方法调用来简化代码。

main_format = '''
s = selection({})
'''.format
item_format = 'self.atoms["CA:"+{s}+\':\'+" "].select_sphere(10)'.format
items = ", ".join(item_format(s=i) for i in range(1, 4))
print(main_format(items))