首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Python -嵌套字典。窃听器在哪里?

Python -嵌套字典。窃听器在哪里?
EN

Stack Overflow用户
提问于 2015-03-13 14:45:42
回答 2查看 186关注 0票数 4

我有一个CSV文件,我已经过滤到一个列表和分组。示例:

代码语言:javascript
复制
     52713
     ['52713', '', 'Vmax', '', 'Start Value', '', '\n']
     ['52713', '', 'Vmax', '', 'ECNumber', '1.14.12.17', '\n']
     ['52713', 'O2', 'Km', 'M', 'Start Value', '3.5E-5', '\n']
     ['52713', 'O2', 'Km', 'M', 'ECNumber', '1.14.12.17', '\n']
     52714
     ['52714', '', 'Vmax', '', 'Start Value', '', '\n']
     ['52714', '', 'Vmax', '', 'ECNumber', '1.14.12.17', '\n']
     ['52714', 'O2', 'Km', 'M', 'Start Value', '1.3E-5', '\n']
     ['52714', 'O2', 'Km', 'M', 'ECNumber', '1.14.12.17', '\n']

由此,我创建了一个嵌套字典,其结构如下:

代码语言:javascript
复制
   dict = ID number:{Km:n, Kcat:n, ECNumber:n}

...for列表中的每个ID。

我使用以下代码创建此字典

代码语言:javascript
复制
    dict = {}

    for key, items in groupby(FilteredTable1[1:], itemgetter(0)):
        #print key
        for subitem in items:
            #print subitem
            dict[subitem[EntryID]] = {}
            dict[subitem[EntryID]]['EC'] = []
            dict[subitem[EntryID]]['Km'] = []
            dict[subitem[EntryID]]['Kcat'] = []
            if 'ECNumber' in subitem:
                dict[subitem[EntryID]]['EC'] = subitem[value]

            if 'Km' in subitem and 'Start Value' in subitem:
                dict[subitem[EntryID]]['Km'] = subitem[value]
                #print subitem

这适用于ECNumber值,但不适用于Km值。它可以打印这条线,显示它将Km值标识为存在,但不把它放在字典中。

示例输出:

代码语言:javascript
复制
    {'Km': [], 'EC': '1.14.12.17', 'Kcat': []}

有什么想法吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-03-13 17:12:36

问题是您的内部for循环一直在重新初始化dict[subitem[EntryID]],即使它可能已经存在。通过显式检查是否已经存在,可以解决以下问题:

代码语言:javascript
复制
dict = {}

for key, items in groupby(FilteredTable1[1:], itemgetter(0)):
    #print key
    for subitem in items:
        #print ' ', subitem
        if subitem[EntryID] not in dict:
            dict[subitem[EntryID]] = {}
            dict[subitem[EntryID]]['EC'] = []
            dict[subitem[EntryID]]['Km'] = []
            dict[subitem[EntryID]]['Kcat'] = []

        if 'ECNumber' in subitem:
            dict[subitem[EntryID]]['EC'] = subitem[value]

        if 'Km' in subitem and 'Start Value' in subitem:
            dict[subitem[EntryID]]['Km'] = subitem[value]
            #print subitem

但是,通过使用下面这样的方法可以提高代码的效率,从而避免了重新计算值和双字典查找。它也不对变量名使用内置类型的名称,这违背了https://www.python.org/dev/peps/pep-0008/中给出的指导方针。它还建议只对类名使用CamelCase,而不是对FilteredTable1这样的变量名称使用--但我没有改变它。

代码语言:javascript
复制
adict = {}

for key, items in groupby(FilteredTable1[1:], itemgetter(0)):
    #print key
    for subitem in items:
        #print ' ', subitem
        entry_id = subitem[EntryID]
        if entry_id not in adict:
            adict[entry_id] = {'EC': [], 'Km': [], 'Kcat': []}

        entry = adict[entry_id]
        if 'ECNumber' in subitem:
            entry['EC'] = subitem[value]

        if 'Km' in subitem and 'Start Value' in subitem:
            entry['Km'] = subitem[value]
            #print subitem

实际上,由于您正在构建字典,所以不清楚使用groupby是否有任何好处。

票数 2
EN

Stack Overflow用户

发布于 2015-03-16 18:34:31

我张贴这篇文章是为了跟进,并在我的previous answer上扩展。

首先,您可以进一步简化代码,方法是不需要检查先前存在的条目,只需将字典创建为collections.defaultdict dict子类,而不是普通的子类:

代码语言:javascript
复制
from collections import defaultdict
adict = defaultdict(lambda: {'EC': [], 'Km': [], 'Kcat': []})

for key, items in groupby(FilteredTable1[1:], itemgetter(0)):
    for subitem in items:
        entry = adict[subitem[EntryID]]
        if 'ECNumber' in subitem:
            entry['EC'] = subitem[value]

        if 'Km' in subitem and 'Start Value' in subitem:
            entry['Km'] = subitem[value]

第二,正如我在另一个答案中提到的那样,我认为使用itertools.groupby()来完成这个任务不会获得任何好处--除了使过程变得比需要的更复杂之外。这是因为基本上你要做的是制作一个字典字典,它的条目都可以随机访问,所以在这样做之前麻烦地将它们分组是没有好处的。下面的代码证明了这一点(结合使用上面所示的defaultdict ):

代码语言:javascript
复制
adict = defaultdict(lambda: {'EC': [], 'Km': [], 'Kcat': []})

for subitem in FilteredTable1[1:]:
    entry = adict[subitem[EntryID]]
    if 'ECNumber' in subitem:
        entry['EC'] = subitem[value]

    if 'Km' in subitem and 'Start Value' in subitem:
        entry['Km'] = subitem[value]
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29035205

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档