[英]Separating a list of (X,Y)
我正在解析PDB文件,並且具有鏈名列表以及XYZ坐標格式(鏈,[坐標])。 我有很多坐標,但是只有3個不同的鏈。 我想將來自同一鏈的所有坐標壓縮到一個列表中,以便我得到鏈= [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”,但是我想一旦理解了就可以得到它們。
您是否想要類似的東西:
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])
您可以使用列表理解:
>>> 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]
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.