【问题标题】:How to make a key from an array of length n如何从长度为 n 的数组中生成密钥
【发布时间】:2019-07-20 02:16:44
【问题描述】:

我正在尝试在 python 中生成一个字典,稍后将其转换为 JSON 对象。

我有一个要用作键的元素列表 ['element1','element2',...'elementn']。

有以下列表:

list1 = ['thing1','thing2',...'thingn']
list2 = ['element1','element2',...'elementn']

我想制作以下 JSON 对象:

x = {
    'thing1' : {
        'thing2' : {
            ....
                'thingn': {}
        }
    },
    'element1' : {
        'element2' : {
            ....
                'elementn': {}
        }
    }
}

这样我就可以像这样访问 x:

x['thing1']['thing2]...['thingn']

然后像这样添加新数据:

x['thing1']['thing2]['newdata']

由于最终的 JSON 对象将是分层的,并且稍后会添加数据,因此我想遍历键列表并生成如上所述的层次结构。

【问题讨论】:

    标签: python json list


    【解决方案1】:

    它使用for 循环获取元素并创建字典,它使用start 获取嵌套字典以在下一个循环中创建下一个字典。

    编辑:我将名称 start 更改为 node,这样可以更好地描述此变量中的内容。它用于在此结构中更深入地移动,例如在树或图中从节点移动到节点。

    x = {}
    
    list1 = ['thing1','thing2','thingn']
    list2 = ['element1','element2','elementn']
    
    node = x  # starting node
    for item in list1:
        node[item] = {}    # create new sub-dictionary
        node = node[item]  # move to new sub-dictionary
    
    node = x  # starting node
    for item in list2:
        node[item] = {}    # create new sub-dictionary
        node = node[item]  # move to new sub-dictionary
    
    print(x)
    
    print(x['thing1']['thing2']['thingn'])
    
    x['thing1']['thing2']['newdata'] = "Hello World!"
    print(x['thing1']['thing2']['newdata'])
    

    编辑:同函数

    def add(start_node, levels):
        node = start_node      # starting node
        for item in levels:
            node[item] = {}    # create new sub-dictionary
            node = node[item]  # move to new sub-dictionary
        #return node
    
    
    x = {}
    
    list1 = ['thing1','thing2','thingn']
    list2 = ['element1','element2','elementn']
    
    add(x, list1)
    add(x, list2)
    
    print(x)
    print(x['thing1']['thing2']['thingn'])
    
    x['thing1']['thing2']['newdata'] = "Hello World!"
    print(x['thing1']['thing2']['newdata'])
    

    使用.split('.')可以使用字符串'element1.element2.elementn'

    add(x, 'element1.element2.elementn'.split('.'))
    

    编辑:类似于获取价值

    def add(node, levels):
        '''node: starting node'''
        for item in levels:
            node[item] = {}    # create new sub-dictionary
            node = node[item]  # move to new sub-dictionary
        #return node
    
    def get(node, levels):
        '''node: starting node'''
        for item in levels:
            node = node[item]  # move to new sub-dictionary
        return node
    
    x = {}
    
    add(x, ['thing1','thing2','thingn'])
    add(x, 'element1.element2.elementn'.split('.'))
    
    x['thing1']['thing2']['newdata'] = "Hello World!"
    print(x['thing1']['thing2']['newdata'])
    
    print( get(x, ['thing1', 'thing2', 'newdata']) )
    print( get(x, 'thing1.thing2.newdata'.split('.') ) )
    

    【讨论】:

    • 我认为“start = start[item]”行会重新初始化变量 start,而不仅仅是更新字典中的位置。
    • 它让我可以更深入地了解这个结构——就像在树或图中从一个节点移动到另一个节点。我在为这个变量找到好名字时遇到了问题,但现在我发布了它应该有名字node
    • 太棒了!我在 Ruby 中复制了相同的内容,试图弄清楚它是如何工作的,但我觉得它很棘手:o。您能否补充说明x 是如何受到影响的(在第一个示例中)?
    • @iGian for list/dictionary Python 在函数中使用引用 - 它不会创建重复的列表/字典 - 因此函数始终适用于原始 x。与y = x 相同 - 两个变量都保持同一个字典。
    猜你喜欢
    • 1970-01-01
    • 2011-02-12
    • 2020-08-18
    • 2022-11-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-31
    • 2013-03-17
    相关资源
    最近更新 更多