Python:defaultdict(dict)如何创建嵌套字典?

时间:2016-06-06 18:10:41

标签: python dictionary nested defaultdict

我需要从目录中的所有文件中获取字符串并以某种方式记录它们,所以我尝试使用defaultdict来创建它,但是我很难弄清楚如何逐步添加到字典的每一层。基本上,字典应该是这样的:

  

文件名

     
    

捆绑

         
      

信息

    
         

捆绑

         
      

信息

    
  
     

文件名

     
    

捆绑

         
      

信息

    
  

等 我把信息作为一个列表,所以我可以将我需要的任何东西附加到列表中,但是当我运行我在这里的东西时,我最终得到一个捆绑包和每个文件名的信息。看起来update()函数正在替换里面的值,我不知道如何让它继续添加然后为每个Bundle创建一个更新的字典。任何帮助都表示赞赏,并对任何困惑感到抱歉。

import collections
import os

devices = collections.defaultdict(lambda: collections.defaultdict(dict))
# bundles = collections.defaultdict(dict)

for filename in os.listdir('.'):
    if os.path.isfile(filename):
        if '.net' in filename:
            dev = open(filename)

            for line in dev:

                line = line.strip()
                values = line.split(' ')

                if values[0] == 'interface':
                    bundle_name = values[1]
                    if '/' in bundle_name:
                        pass
                    else:
                        if len(values) == 2:
                            ur_device = devices[filename]
                            ur_device.update(
                                {
                                    'bundle_name': bundle_name,
                                    'bundle_info': [],
                                }
                            )

                if 'secondary' in values:
                    pass
                elif values[0] == 'ipv4' and values[1] == 'address' and len(values) == 4:
                    ur_device['bundle_info'].append(
                        {
                            'ip_address': values[2],
                            'subnet_mask': values[3],
                        }
                    )

            dev.close()

1 个答案:

答案 0 :(得分:2)

字典具有键和值,只要你将某些东西放入具有相同键的字典中,它就会替换该值。例如:

dictionary = {}
# Insert value1 at index key1
dictionary["key1"] = "value1"

# Overwrite the value at index key1 to value2
dictionary["key1"] = "value2"

print(dictionary["key1"]) # prints value2

有一些事情对你的代码没有意义,但我建议你使用上面的语法实际添加到字典中的东西(而不是用于添加密钥列表的更新方法/值对成字典。)

下面我用#**

为你的代码标记了一些建议
import collections
import os

#** I'm guessing you want to put your devices into this dict, but you never put anything into it
devices = collections.defaultdict(lambda: collections.defaultdict(dict))
# bundles = collections.defaultdict(dict)

for filename in os.listdir('.'):
    if os.path.isfile(filename):
        if '.net' in filename:
            dev = open(filename)

            for line in dev:

                line = line.strip()
                values = line.split(' ')
                #** declare bundle_name out here, it is better form since we will make use of it in the immediate scopes below this
                bundle_name = ''

                if values[0] == 'interface':
                    bundle_name = values[1]
                    if '/' in bundle_name:
                        pass
                    else:
                        if len(values) == 2:
                            #** This is assuming you populated devices somewhere else??
                            devices[filename][bundle_name] = []

                if 'secondary' in values:
                    pass
                elif values[0] == 'ipv4' and values[1] == 'address' and len(values) == 4:
                    #** ur_device was not declared in this scope, it is a bad idea to use it here, instead index it out of the devices dict
                    #** it also might be worth having a check here to ensure devices[filename] actually exists first
                    devices[filename][bundle_name].append(
                        {
                            'ip_address': values[2],
                            'subnet_mask': values[3],
                        }
                    )

            dev.close()

**编辑**

查看您的问题,您需要为每个文件名设置多个包。但是您的字典结构不够详细,您似乎没有提供有关如何使用数据初始化设备的代码。

基本上,你应该考虑字典的每个级别的关键字,而不仅仅是什么值。

设备(文件名:设备)
device(bundle_name?:info)< - 你缺少这个字典
info(您追加详细信息的列表)

我改变了上面的代码,最好猜测你的意图。