将项添加到字典中的集

时间:2015-10-01 18:50:49

标签: python dictionary set

我有一个字典列表,用于将不同的ID映射到中央ID。我有一个文档,其中包含与术语相关的不同ID。我创建了一个函数,它现在有一个键,来自文档中不同ID的中心ID。 goFile是文档,其中第一列中有ID,第二列中有GOterm。 mappingList是包含字典的列表,其中goFile中的ID被映射到主ID。 我的预期输出是一个字典,主要ID作为键,以及与其相关联的go术语作为值的集合。

public class Position{
    public static void main(String args[]){
        String Alpha = ("abcd");
        for (int i = 0 ; i<Alpha .length() ; i++)
        if (Alpha .charAt(i) == 'd')
        System.out.println(i);
    }
}

我的问题是,现在我必须在我的GOdict中将中心ID添加到文档中与不同ID相关联的术语。为避免重复,我使用一组(GOset)。我该怎么做?我的所有尝试都将所有术语映射到所有主要ID 一些样本:

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   

goFile:

mappingList = [{'1234': 'mainID1', '456': 'mainID2'}, {'789': 'mainID2'}]

预期产出:

1234    GOTERM1
1234    GOTERM2
456    GOTERM1
456    GOTERM3
789    GOTERM1

1 个答案:

答案 0 :(得分:1)

首先,你不应该使用变量名称&#39; dict&#39;,因为它会影响内置的dict类,引起你某些问题。

以下内容对您有用:

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 insetdefault()样板。

对于文件中的每一行,我们检查第一项(value_id)是否是任何映射字典中的键,如果是,则将第二项(go_term)添加到字典中的value_id&#39; s 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)