【问题标题】:Separating a list of (X,Y)分离 (X,Y) 的列表
【发布时间】:2013-07-20 00:03:41
【问题描述】:

我正在解析 PDB 文件,并且我有一个链名称列表以及格式为 (chain,[coordinate]) 的 XYZ 坐标。我有很多坐标,但只有 3 个不同的链。我想将同一链中的所有坐标压缩到一个列表中,这样我就可以得到 chain = [coordinate]、[coordinate]、[coordinate] 等等。我查看了 biopython 文档,但我很难准确理解如何获得我想要的坐标,所以我决定手动提取坐标。这是我到目前为止的代码:

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”,但我想一旦我克服了理解的障碍,我就能得到它们..

【问题讨论】:

  • 您是要创建变量A,还是打印出“A = ([1.719, -25.217, 8.694]), ([2.934, -21.997, 7.084]),(5.35, -19.779,8.986])..."?
  • 另外,请发布 PDB 文件相关部分的代表性示例,以便我们知道您要解析的内容
  • 有一个名为 pdb_tools 的密集库,用 Python 编写。

标签: python list zip biopython


【解决方案1】:

只做一个元组列表

>>> 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])

【讨论】:

  • 这正是我想要的!我喜欢它维持秩序,因为它可能在未来的某个时候变得重要。
  • 有没有办法使用这个 itertool 将它们保存到自己的列表中?
  • 只需更改此行并将其附加到新列表中。 print(id, [c[1:] for c in coor][0]).是你想要的吗
【解决方案2】:

你想要类似的东西:

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 坐标。

【讨论】:

  • 这看起来很有趣。我将不得不花一点时间来理解 python 字典。它们比列表更棘手。
【解决方案3】:

您可以使用列表推导:

>>> 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]

【讨论】:

  • 如果不是'A'怎么办?目前尚不清楚我们是否会先验地知道那封信是什么
  • A 只是象征原子所属的肽链,在这种情况下它是脯氨酸。所以一般A是不能保证的。
  • 完全正确的赛斯。在 PDB 文件中,链总是连续列出的,即一旦有一个字母表示该链,该链字母将一直保留到下一个链启动。在这种情况下,它会变成这样: A A A A L L H H 在我的代码中,我将所有链名存储在 allchainids 中,所以它里面有 "['A' 'L' 'H']。
猜你喜欢
  • 1970-01-01
  • 2016-03-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-01-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多