Python 在比较两个列表时,如何在特定字符串后打印内容?
我试图比较一个列表中的字符串,如果该字符串也在另一个列表中,我想在新行上打印一些内容。不幸的是,这两个列表中有几个(数字可能不同)相同的变量在彼此下面,我想在最后一个下面打印TER。我哪里做错了Python 在比较两个列表时,如何在特定字符串后打印内容?,python,Python,我试图比较一个列表中的字符串,如果该字符串也在另一个列表中,我想在新行上打印一些内容。不幸的是,这两个列表中有几个(数字可能不同)相同的变量在彼此下面,我想在最后一个下面打印TER。我哪里做错了 import sys import argparse def main(argv): parser = argparse.ArgumentParser(description='Add Ter records') parser.add_argument('infile', help='
import sys
import argparse
def main(argv):
parser = argparse.ArgumentParser(description='Add Ter records')
parser.add_argument('infile', help='input file (PDB format)')
parser.add_argument('outfile', help='output file (PDB format)')
parser.add_argument('reference', help =' ref')
args = parser.parse_args()
resnum_1 =[]
res_1 = []
with open(args.infile, "r") as f, open(args.outfile, "w+") as of, open(args.reference,"r") as rf:
for line in f:
of.write(line)
for line in rf:
if line[0:3]== "TER":
resnum = line[22:27]
resnum_1.append(resnum)
resnum_2 = []
for i in resnum_1:
resnum_2.append(i.strip())
of.seek(0)
for line in of:
if line [0:4]== "ATOM":
res = line[22:27]
res_1.append(res)
res_2 = []
for i in res_1:
res_2.append(i.strip())
for x in res_2:
if x in resnum_2 and (res_2.index(x))+1 != x:
of.write("\nTER\n")
else:
continue
if __name__ == "__main__":
main(sys.argv)
infle
示例:
ATOM 1 N GLU D 384 51.765 39.857 23.514 1.00 0.00 N
ATOM 2 H1 GLU D 384 50.823 39.839 23.150 1.00 0.00 H
ATOM 3 H2 GLU D 384 51.956 39.044 24.081 1.00 0.00 H
ATOM 4 H3 GLU D 384 52.469 39.840 22.790 1.00 0.00 H
ATOM 5 CA GLU D 384 51.934 41.135 24.345 1.00 0.00 C
ATOM 6 HA GLU D 384 53.002 41.062 24.550 1.00 0.00 H
ATOM 7 CB GLU D 384 51.712 42.439 23.503 1.00 0.00 C
ATOM 8 HB2 GLU D 384 52.307 42.297 22.600 1.00 0.00 H
ATOM 9 HB3 GLU D 384 50.640 42.356 23.323 1.00 0.00 H
ATOM 10 CG GLU D 384 52.024 43.786 24.125 1.00 0.00 C
ATOM 11 HG2 GLU D 384 52.138 44.557 23.363 1.00 0.00 H
ATOM 12 HG3 GLU D 384 51.201 44.086 24.773 1.00 0.00 H
ATOM 13 CD GLU D 384 53.381 43.828 24.935 1.00 0.00 C
ATOM 14 OE1 GLU D 384 53.634 43.069 25.869 1.00 0.00 O
参考
示例:
ATOM 1 N GLU D 384 51.765 39.857 23.514 1.00 0.00 N
ATOM 2 H1 GLU D 384 50.823 39.839 23.150 1.00 0.00 H
ATOM 3 H2 GLU D 384 51.956 39.044 24.081 1.00 0.00 H
ATOM 4 H3 GLU D 384 52.469 39.840 22.790 1.00 0.00 H
ATOM 5 CA GLU D 384 51.934 41.135 24.345 1.00 0.00 C
ATOM 6 HA GLU D 384 53.002 41.062 24.550 1.00 0.00 H
ATOM 7 CB GLU D 384 51.712 42.439 23.503 1.00 0.00 C
ATOM 8 HB2 GLU D 384 52.307 42.297 22.600 1.00 0.00 H
ATOM 9 HB3 GLU D 384 50.640 42.356 23.323 1.00 0.00 H
ATOM 10 CG GLU D 384 52.024 43.786 24.125 1.00 0.00 C
ATOM 11 HG2 GLU D 384 52.138 44.557 23.363 1.00 0.00 H
TER
ATOM 12 HG3 GLU D 384 51.201 44.086 24.773 1.00 0.00 H
ATOM 13 CD GLU D 384 53.381 43.828 24.935 1.00 0.00 C
如果我正确理解了您的问题,下面的代码片段应该会对您有所帮助
a = [1, 2, 3, 4, 7]
b = [1, 2, 5, 7, 16]
streak = False
for e in a:
if e in b:
streak = True
elif streak:
streak = False
of.write("TER\n")
of.write(e)
if e in b:
of.write("TER\n")
12
TER
3
4
7
特 它假定列表a的元素可以位于列表b中的任何位置。
还请注意,它不标记序列的开始。。。只有它们的末端。您能提供两个列表和预期输出的示例吗?就在这里。此时,输出文件与填充文件相同。输出应该添加TER记录,但在其他方面看起来是一样的。事实上,我不理解你的例子。原子线12在参考文件和内嵌中完全相同。为什么TER在这行前面?对不起,这只是一个例子。在现实生活中,在res编号之后,它们会有所不同。如何将其打印到最后一个匹配的e下面的输出文件中?res是384,文件中有许多384。我只希望它打印后的最后一个(当下一个分辨率将不是384)。如果输出是你想要的。把打印的内容换成。把(e)写在你的代码里,我不明白。你说的“res是384”是什么意思?所以res变量对应于填充和引用示例中的数字384。在您的示例中,您有一个不重复的数字列表。我会这样做:list =(384384384385385…)。哦,我把数字作为一个例子,我假设你会考虑完整行作为元素。