【问题标题】:creating keys for a dictionary from a list containing the keys从包含键的列表中为字典创建键
【发布时间】:2013-02-26 12:55:06
【问题描述】:

我正在尝试构建一个矩阵,该矩阵在多个级别中保存多个值。 我正在尝试生成这样的字典:

{'routername':{'channel':{'01':<value>,'02':<value>}}}

最高级别的键数可能会有所不同。

脚本正在生成一个可用路由器列表和另一个可用通道列表。 我写了一个相当麻烦的函数来测试一个键,如果它不存在,它将键添加到字典中。

所以,我想知道是否没有一种简单的方法可以为列表“路由器”中的键创建一个包含空值的字典

def AddToChart(passed_seq):
    try:
        if str(passed_seq[0]) in chart_dict:
            if str(passed_seq[1]) in chart_dict[passed_seq[0]]:
                if str(passed_seq[2]) in chart_dict[passed_seq[0]][passed_seq[1]]:
                    if str(passed_seq[3]) in chart_dict[passed_seq[0]][passed_seq[1]][passed_seq[2]]:
                        chart_dict[passed_seq[0]][passed_seq[1]][passed_seq[2]][passed_seq[3]].update(err_sub_dict)

                    else:    
                        chart_dict[passed_seq[0]][passed_seq[1]][passed_seq[2]].update({passed_seq[3]:{}})
                        chart_dict[passed_seq[0]][passed_seq[1]][passed_seq[2]][passed_seq[3]].update(err_sub_dict)
                else:
                    chart_dict[passed_seq[0]][passed_seq[1]].update({passed_seq[2]:{passed_seq[3]:{}}})
                    chart_dict[passed_seq[0]][passed_seq[1]][passed_seq[2]][passed_seq[3]].update(err_sub_dict)
            else:
                chart_dict[passed_seq[0]].update({passed_seq[1]:{passed_seq[2]:{passed_seq[3]:{}}}})
                chart_dict[passed_seq[0]][passed_seq[1]][passed_seq[2]][passed_seq[3]].update(err_sub_dict)
        else:     
            chart_dict.update({passed_seq[0]:{passed_seq[1]:{passed_seq[2]:{passed_seq[3]:{}}}}})
            chart_dict[passed_seq[0]][passed_seq[1]][passed_seq[2]][passed_seq[3]].update(err_sub_dict)
    except ValueError:
        print "AddToChart: ",err_sub_dict,sys.exc_info()[1][0]   
    except:
        print sys.exc_info()
        print "AddToChart: variable not defined: "    + str(passed_seq)

【问题讨论】:

  • 这是什么语言?请标记语言!

标签: python list dictionary python-2.7


【解决方案1】:

我建议对chart_dict 使用嵌套的collections.defaultdict。它允许您提供工厂函数来设置新值,因此您请求的任何键都将始终有效。设置如此深的嵌套结构有点棘手,但我认为以下内容将为您的四级结构做正确的事情(我假设您的 &lt;value&gt; 项目也是字典,因为您当前的代码似乎期望):

chart_dict = defaultdict(lambda:defaultdict(lambda:defaultdict(dict)))

有了这些,您应该能够执行以下操作,而不必担心之前是否有任何键引用了字典中的任何内容:

a, b, c = passed_seq
chart_dict[a][b][c].update(err_sub_dict)

我建议也执行类似上述变量解包的操作,但您可能应该使用比abc 更好的名称。好的变量名可以把一些难以理解的东西变成容易掌握的东西。

【讨论】:

    【解决方案2】:

    你应该使用

    dict.setdefault()
    

    docs

    例子:

    d = {}
    d = d.setdefault("k","eggs")
    
    >> d["k"]
    eggs
    
    d2 = {"k":1}
    d2 = d2.setdefault("k","spam")
    >> d2["k"]
    1
    

    【讨论】:

      猜你喜欢
      • 2016-10-08
      • 2021-01-21
      • 1970-01-01
      • 2015-09-13
      • 2011-02-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-05
      相关资源
      最近更新 更多