Python 分离(X,Y)的列表
我正在解析PDB文件,我有一个链名称列表,以及格式为(链,[坐标])的XYZ坐标。我有很多坐标,但只有3条不同的链。我想将同一个链中的所有坐标压缩到一个列表中,这样我就可以得到chain=[coordinate]、[coordinate]、[coordinate]等等。我查看了biopython文档,但是我很难准确地理解如何获得我想要的坐标,所以我决定手动提取坐标。这是我目前掌握的代码:Python 分离(X,Y)的列表,python,list,zip,biopython,Python,List,Zip,Biopython,我正在解析PDB文件,我有一个链名称列表,以及格式为(链,[坐标])的XYZ坐标。我有很多坐标,但只有3条不同的链。我想将同一个链中的所有坐标压缩到一个列表中,这样我就可以得到chain=[coordinate]、[coordinate]、[coordinate]等等。我查看了biopython文档,但是我很难准确地理解如何获得我想要的坐标,所以我决定手动提取坐标。这是我目前掌握的代码: pdb_file = open('1adq.pdb') import numpy as np chaini
pdb_file = open('1adq.pdb')
import numpy as np
chainids = []
chainpos= []
for line in pdb_file:
if line.startswith("ATOM"):
# get x, y, z coordinates for Cas
chainid =str((line[20:22].strip()))
atomid = str((line[16:20].strip()))
pdbresn= int(line[23:26].strip())
x = float(line[30:38].strip())
y = float(line[38:46].strip())
z = float(line[46:54].strip())
if line[12:16].strip() == "CA":
chainpos.append((chainid,[x, y, z]))
chainids.append(chainid)
allchainids = np.unique(chainids)
print(chainpos)
和一些输出:
[('A', [1.719, -25.217, 8.694]), ('A', [2.934, -21.997, 7.084]), ('A', [5.35, -19.779, 8.986])
我的理想输出是:
A = ([1.719, -25.217, 8.694]), ([2.934, -21.997, 7.084]),(5.35, -19.779,8.986])...
谢谢
Here is a section of PDB file:
ATOM 1 N PRO A 238 1.285 -26.367 7.882 0.00 25.30 N
ATOM 2 CA PRO A 238 1.719 -25.217 8.694 0.00 25.30 C
ATOM 3 C PRO A 238 2.599 -24.279 7.885 0.00 25.30 C
ATOM 4 O PRO A 238 3.573 -24.716 7.275 0.00 25.30 O
ATOM 5 CB PRO A 238 2.469 -25.791 9.881 0.00 25.30 C
A是第4列中的链名称。我不知道链名是什么,但由于我正在逐行解析,所以我将链名与我前面提到的格式中的坐标粘贴在一起。现在我想把所有前面有“A”的坐标都拉出来,然后把它们放在一个名为“A”的列表中。我不能用“A”来硬编码,因为它并不总是“A”。我也有“L”和“H”,但我想一旦我克服了理解的困难,我就能得到它们。你可以使用列表理解:
>>> print chainpos
[('A', [1.719, -25.217, 8.694]), ('A', [2.934, -21.997, 7.084]), ('A', [5.35, -19.779, 8.986])]
>>> print "A =", [ t[1] for t in chainpos]
您想要类似于:
import numpy as np
chain_dict = {}
for line in open('input'):
if line.startswith("ATOM"):
line = line.split()
# get x, y, z coordinates for Cas
chainid = line[4]
atomid = line[2]
pdbresn= line[5]
xyz = [line[6],line[7],line[8]]
if chainid not in chain_dict:
chain_dict[chainid]=[xyz]
else:
chain_dict[chainid].append(xyz)
对于您的示例数据,其中给出:
>>> chain_dict
{'A': [['1.285', '-26.367', '7.882'], ['1.719', '-25.217', '8.694'], ['2.599', '-24.279', '7.885'], ['3.573', '-24.716', '7.275'], ['2.469', '-25.791', '9.881']]
既然它是一本字典,显然你可以:
>>> chain_dict['A']
[['1.285', '-26.367', '7.882'], ['1.719', '-25.217', '8.694'], ['2.599', '-24.279', '7.885'], ['3.573', '-24.716', '7.275'], ['2.469', '-25.791', '9.881']]
要获得您感兴趣的链的xyz坐标。只需列出元组
>>> chainpos.append((chainid,x, y, z))
>>> chainpos
[('A', 1.719, -25.217, 8.694), ('A', 2.934, -21.997, 7.084)]
>>> import itertools
>>> for id, coor in itertools.groupby(chainpos,lambda x:x[0]):
... print(id, [c[1:] for c in coor])
您是否正在尝试创建变量
A
,或打印出“A=([1.719,-25.217,8.694])、([2.934,-21.997,7.084])、(5.35,-19.779,8.986])?另外,请发布PDB文件相关部分的代表性示例,以便我们了解您正在尝试解析的内容。有一个名为PDB_工具的密集库,写在Python上。如果它不是'A'
?现在还不清楚我们是否知道这个字母是什么,prioriA只是象征着原子所属的肽链,在这种情况下,它是脯氨酸。所以一般来说,A
是不能保证的。完全正确的赛斯。在PDB文件中,链始终是连续列出的,也就是说,一旦有一个字母表示链,该链字母将一直保留到下一个链开始。在本例中,它将类似于:在我的代码中,我将所有链名存储在AllChainID中,因此它有“['A''L''H']在它里面。这看起来很有趣。我需要花一点时间来理解python字典。它们比列表更复杂。这正是我想要的!我喜欢它保持秩序,因为它在将来的某个时候可能变得很重要。有没有一种方法可以用这个itertool将它们保存到自己的列表中?只需更改t打印(id,[c[1:]代表c in coor][0])。这是您想要的吗