如何在python中从列表创建多个子类?
我试图以分层的方式获取数据,所以我决定转向子类。我从中获取数据的文件格式如下:如何在python中从列表创建多个子类?,python,subclass,Python,Subclass,我试图以分层的方式获取数据,所以我决定转向子类。我从中获取数据的文件格式如下: 2WQZ_chain_A Score = 338.0 53-164 208-317 327-595 611-654 2WQZ_chain_B Score = 344.0 53-164 205-317 327-595 611-655 2XB6_chain_A Score = 319.0 64-163 211-317 327-596 613-654 2XB6_chain_B Score = 329.0 53-163
2WQZ_chain_A
Score = 338.0
53-164
208-317
327-595
611-654
2WQZ_chain_B
Score = 344.0
53-164
205-317
327-595
611-655
2XB6_chain_A
Score = 319.0
64-163
211-317
327-596
613-654
2XB6_chain_B
Score = 329.0
53-163
212-317
327-596
613-654
def parse_block(lines):
pdb_name = lines[0][:4]
chain = lines[0][5:]
score = lines[1].split("=")[1].strip()
intervals = lines[2:]
return (pdb_name, chain, score, intervals)
{'2WQZ': {'chain_A': {'intervals': ['53-164', '208-317', '327-595', '611-654'],
'score': '338.0'},
'chain_B': {'intervals': ['53-164', '205-317', '327-595', '611-655'],
'score': '344.0'}},
'2XB6': {'chain_A': {'intervals': ['64-163', '211-317', '327-596', '613-654'],
'score': '319.0'},
'chain_B': {'intervals': ['53-163', '212-317', '327-596', '613-654'],
'score': '329.0'}}}
我想得到的是一个名为PDB name的第一个类(即:2WQZ),其中的子类名为chain_a、chain_B等等。这些子类应该包含一个名为“score”的对象和第三个名为“interval”的子类,其中包含可能的间隔。总的想法是这样的
目前,我尝试使用字典,但最终得到了正确的PDB类,但只有第二个链,我的代码是
class PDB(object):
def __init__(self, pdbname):
self.pdbid = pdbname
class Chain(PDB):
def __init__(self, chainame, score, pdbname):
self.chainid = chainame
self.score = score
super().__init__(pdbname)
making_class = open("covered_intervals.txt", "r").readlines()
pdblist = []
for i in making_class:
if "chain" in i:
pdblist.append(i[:4])
pdblist = list(dict.fromkeys(pdblist))
pdblist2 = dict.fromkeys(pdblist)
for i in pdblist:
pdblist2[i] = PDB(i)
for j in making_class:
if i in j:
chainame = j[5:12]
pdblist2[i] = Chain(chainame, 4, i)
4是一个占位符,我明白为什么我只得到最后一个链,但不知道如何在同一个PDB下获得两个链。首先,我建议创建一些东西,可以将文件中的一个文本块解析为可用变量,例如:
2WQZ_chain_A
Score = 338.0
53-164
208-317
327-595
611-654
2WQZ_chain_B
Score = 344.0
53-164
205-317
327-595
611-655
2XB6_chain_A
Score = 319.0
64-163
211-317
327-596
613-654
2XB6_chain_B
Score = 329.0
53-163
212-317
327-596
613-654
def parse_block(lines):
pdb_name = lines[0][:4]
chain = lines[0][5:]
score = lines[1].split("=")[1].strip()
intervals = lines[2:]
return (pdb_name, chain, score, intervals)
{'2WQZ': {'chain_A': {'intervals': ['53-164', '208-317', '327-595', '611-654'],
'score': '338.0'},
'chain_B': {'intervals': ['53-164', '205-317', '327-595', '611-655'],
'score': '344.0'}},
'2XB6': {'chain_A': {'intervals': ['64-163', '211-317', '327-596', '613-654'],
'score': '319.0'},
'chain_B': {'intervals': ['53-163', '212-317', '327-596', '613-654'],
'score': '329.0'}}}
使用它,您可以构建类,或者使用嵌套字典,这样也可以很好地适应数据结构
from collections import defaultdict
with open("pdbdata", "r") as f:
content = f.read()
pdb_dict = defaultdict(dict)
for block in content.split("\n\n"):
pdb_name, chain, score, intervals = parse_block(block.splitlines())
pdb_dict[pdb_name][chain] = {"score": score, "intervals": intervals}
生成的嵌套dict如下所示:
2WQZ_chain_A
Score = 338.0
53-164
208-317
327-595
611-654
2WQZ_chain_B
Score = 344.0
53-164
205-317
327-595
611-655
2XB6_chain_A
Score = 319.0
64-163
211-317
327-596
613-654
2XB6_chain_B
Score = 329.0
53-163
212-317
327-596
613-654
def parse_block(lines):
pdb_name = lines[0][:4]
chain = lines[0][5:]
score = lines[1].split("=")[1].strip()
intervals = lines[2:]
return (pdb_name, chain, score, intervals)
{'2WQZ': {'chain_A': {'intervals': ['53-164', '208-317', '327-595', '611-654'],
'score': '338.0'},
'chain_B': {'intervals': ['53-164', '205-317', '327-595', '611-655'],
'score': '344.0'}},
'2XB6': {'chain_A': {'intervals': ['64-163', '211-317', '327-596', '613-654'],
'score': '319.0'},
'chain_B': {'intervals': ['53-163', '212-317', '327-596', '613-654'],
'score': '329.0'}}}
在这种情况下,可以为顶部节点创建一个字典,因为它是一个固定深度的树,所以不需要类嵌套。链类将有三个组件
非常感谢,您能详细说明一下如何实际生成正确的子类吗?我是新来的topic@FrancescoOliva我不认为继承是正确的工具。您可以创建具有所需属性的独立类,并使用组合来连接它们。例如,
PDB
类可以有一个属性chains
,即Chain
对象的列表。这正是我要查找的。非常感谢你!请注意:range1类中有一个错误。在您编写时,它只打印正在考虑的间隔的第一个和第二个字符(即:53-164变为5和3)。self.start=int(str[0])和self.end=int(str[1])应该是self.start=int(x[0])和self.end=int(x[1])