我有一个字典列表,它将不同的ID映射到一个中心ID。我有一个文档,其中包含与术语相关联的这些不同ID。我已经创建了一个函数,它现在有一个键,即来自文档中不同ID的中心ID。goFile是一个文档,第一列中有一个ID,第二列中有一个GOterm。mappingList是一个包含字典的列表,其中goFile中的ID映射到主ID。 我期望的输出是一个以main ID作为键的字典,以及一个以go术语作为值的集合。你知道吗
def parseGO(mappingList, goFile):
# open the file
file = open(goFile)
# this will be the dictionary that this function returns
# entries will have as a key an Ensembl ID
# and the value will be a set of GO terms
GOdict = {}
GOset = set()
for line in file:
splitline = line.split(' ')
GO_term = splitline[1]
value_ID = splitline[0]
for dict in mappingList:
if value_ID in dict:
ENSB_term = dict[value_ID]
#my best try
for dict in mappingList:
for key in GOdict.keys():
if value_ID in dict and key == dict[value_ID]:
GOdict[ENSB_term].add(GO_term)
GOdict[ENSB_term] = GOset
return GOdict
我的问题是,现在我必须将文档中与不同ID相关联的术语添加到文档的中心ID中。为了避免重复,我使用了一个集合(GOset)。我该怎么做?我的所有try都将所有术语映射到所有主id。
一些示例:
mappingList = [{'1234': 'mainID1', '456': 'mainID2'}, {'789': 'mainID2'}]
GO文件:
1234 GOTERM1
1234 GOTERM2
456 GOTERM1
456 GOTERM3
789 GOTERM1
预期产量:
GOdict = {'mainID1': set([GOTERM1, GOTERM2]), 'mainID2': set([GOTERM1, GOTERM3])}
首先,您不应该使用变量名'dict',因为它会隐藏内置的
dict
类,会在某个时候给您带来问题。你知道吗以下几点应该对您有用:
代码相当简单,但这里有一个分解。你知道吗
我们使用默认字典而不是普通字典,这样就可以消除所有
if in
或setdefault()
样板。你知道吗对于文件中的每一行,我们检查第一项(
value_id
)是否是任何映射字典中的键,如果是,则将第二项(go_term
)的行添加到字典中该value_id
的set
。你知道吗编辑:请求在没有
defaultdict()
的情况下执行此操作。假设go_dict
只是一个普通字典(go_dict = {}
),for循环如下所示:相关问题 更多 >
编程相关推荐