将项目添加到字典中的集合
Adding items to sets in a dictionary
我有一个字典列表,将不同的 ID 映射到一个中央 ID。我有一个文档,其中包含与术语相关的这些不同 ID。我创建了一个函数,该函数现在有一个键,即来自文档中不同 ID 的中央 ID。 goFile 是文档,其中第一列中有一个 ID,第二列中有一个 GOterm。 mappingList 是一个包含字典的列表,其中 goFile 中的 ID 映射到主 ID。
我的预期输出是一个以主 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 相关联的术语添加到我的 GOdict 中的中央 ID。为了避免重复,我使用了一套 (GOset)。我该怎么做?我所有的尝试都将所有术语映射到所有主要 ID。
一些示例:
mappingList = [{'1234': 'mainID1', '456': 'mainID2'}, {'789': 'mainID2'}]
goFile:
1234 GOTERM1
1234 GOTERM2
456 GOTERM1
456 GOTERM3
789 GOTERM1
预期输出:
GOdict = {'mainID1': set([GOTERM1, GOTERM2]), 'mainID2': set([GOTERM1, GOTERM3])}
首先,你不应该使用变量名 'dict',因为它隐藏了内置 dict
class,并且 will 有时会给你带来麻烦。
以下应该适合您:
from collections import defaultdict
def parse_go(mapping_list, go_file):
go_dict = defaultdict(set)
with open(go_file) as f: # Better garbage handling using 'with'
for line in f:
(value_id, go_term) = line.split() # Feel free to change the split behaviour
# work better for you.
for map_dict in mapping_list:
if value_id in map_dict:
go_dict[map_dict[value_id]].add(go_term)
return go_dict
代码相当简单,但还是要分解一下。
我们使用默认字典而不是普通字典,因此我们可以消除所有 if in
或 setdefault()
样板文件。
对于文件中的每一行,我们检查第一项 (value_id
) 是否是任何映射字典中的键,如果是,则添加行第二项 (go_term
) 到字典中 value_id
的 set
。
编辑:请求在没有 defaultdict()
的情况下执行此操作。假设 go_dict
只是一个普通的字典 (go_dict = {}
),你的 for 循环看起来像:
for map_dict in mapping_list:
if value_id in map_dict:
esnb_entry = go_dict.setdefault(map_dict[value_id], set())
esnb_entry.add(go_term)
我有一个字典列表,将不同的 ID 映射到一个中央 ID。我有一个文档,其中包含与术语相关的这些不同 ID。我创建了一个函数,该函数现在有一个键,即来自文档中不同 ID 的中央 ID。 goFile 是文档,其中第一列中有一个 ID,第二列中有一个 GOterm。 mappingList 是一个包含字典的列表,其中 goFile 中的 ID 映射到主 ID。 我的预期输出是一个以主 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 相关联的术语添加到我的 GOdict 中的中央 ID。为了避免重复,我使用了一套 (GOset)。我该怎么做?我所有的尝试都将所有术语映射到所有主要 ID。
一些示例:
mappingList = [{'1234': 'mainID1', '456': 'mainID2'}, {'789': 'mainID2'}]
goFile:
1234 GOTERM1
1234 GOTERM2
456 GOTERM1
456 GOTERM3
789 GOTERM1
预期输出:
GOdict = {'mainID1': set([GOTERM1, GOTERM2]), 'mainID2': set([GOTERM1, GOTERM3])}
首先,你不应该使用变量名 'dict',因为它隐藏了内置 dict
class,并且 will 有时会给你带来麻烦。
以下应该适合您:
from collections import defaultdict
def parse_go(mapping_list, go_file):
go_dict = defaultdict(set)
with open(go_file) as f: # Better garbage handling using 'with'
for line in f:
(value_id, go_term) = line.split() # Feel free to change the split behaviour
# work better for you.
for map_dict in mapping_list:
if value_id in map_dict:
go_dict[map_dict[value_id]].add(go_term)
return go_dict
代码相当简单,但还是要分解一下。
我们使用默认字典而不是普通字典,因此我们可以消除所有 if in
或 setdefault()
样板文件。
对于文件中的每一行,我们检查第一项 (value_id
) 是否是任何映射字典中的键,如果是,则添加行第二项 (go_term
) 到字典中 value_id
的 set
。
编辑:请求在没有 defaultdict()
的情况下执行此操作。假设 go_dict
只是一个普通的字典 (go_dict = {}
),你的 for 循环看起来像:
for map_dict in mapping_list:
if value_id in map_dict:
esnb_entry = go_dict.setdefault(map_dict[value_id], set())
esnb_entry.add(go_term)