嵌套字典中的值

时间:2017-11-10 08:15:16

标签: python dictionary

UPDATE :如何访问嵌套字典中的值,其中一个需要两个键,第一个用于查找内部字典,第二个用于查找该键值的值。

python如何使用两个键从嵌套字典中访问值?或者我必须重组词典/创建单独的词典吗?

例如,我想访问

  • ['d5']['raw_file']
  • 的值
  • 所有"拳击键的['append_dir_to_filename']的值"例如g7, d5, a9

列出项目

config = {
    'g7': {},
    'd5': {},
    'a9': {},
}    
config['g7']['append_dir_to_filename'] = 1,
config['g7']['raw_file'] = ('cr2', 'jpg', 'mp4'),

config['d5']['append_dir_to_filename'] = 1,
config['d5']['raw_file'] = ('nef', 'jpg', 'avi'),

config['a9']['append_dir_to_filename'] = 1,
config['a9']['raw_file'] = ('mp4', 'jpg', 'avi')

关于构造嵌套字典,这将是每一(1)个摄像机的复杂性。共有10种摄像头类型,目标是通过一次扫描从这些摄像头的媒体文件重命名,排序,提取信息等:

config['d5']['append_dir_to_filename'] = 1
config['d5']['device_name'] = 'Nikon-D5'
config['d5']['raw_file'] = ('nef', 'jpg', 'avi')
config['d5']['sup_file'] = ('jpg', 'wav')
config['d5']['to_else_file'] = ('avi')
config['d5']['timestamp'] = ('lwt')
config['d5']['md5'] = 1
config['d5']['code1'] = 'FAR'
config['d5']['gps'] = 1

2 个答案:

答案 0 :(得分:2)

您可以按照分配值的方式访问这些值:

print(config['g7']['append_dir_to_filename'])
print(config['d5']['append_dir_to_filename'])
print(config['a9']['raw_file'])
...

要访问嵌套字典中的值,您需要两个键:第一个key1用于查找内部字典,第二个用于查找key2处的值。

要为['append_dir_to_filename']g7d5等所有“拳头密钥”访问密钥a9的值,您必须迭代config ,它会让你key1,并在所需的位置读取值:

for key1 in config:
    print(config[key1]['append_dir_to_filename'])

编辑:

(感谢@MartijnPieters在评论中的建议) 如果您要做的就是查看值,最好循环遍历dict.values()并保存重复的config [key1]:

for inner in config.values():
    print(inner['append_dir_to_filename'])

答案 1 :(得分:2)

您有嵌套词典。你的外部字典键都引用另一个字典,然后它也有键。 Python允许你将表达式链接在那里。

因此,要访问特定的内部值,首先要访问外部字典:

config['d5']

这会生成另一个字典对象,您只需将另一个[...]密钥访问表达式应用于该结果:

config['d5']['raw_file']

如果您需要在所有嵌套字典上访问相同的密钥,则需要循环:

for nested in config.values():
    print(nested['append_dir_to_filename'])

此处nested是对config字典中每个嵌套字典的引用。

更复杂的示例可能是打印出内部字典中值的条件成立的所有外键。比如打印'append_dir_to_filename'1的所有密钥:

for name, nested in config.items():
    if nested['append_dir_to_filename'] == 1:
        print(name)

dict.items()允许您遍历所有(键,嵌套字典)对,然后再次将该嵌套值视为另一个字典对象来测试值。

如果您要做的只是跟踪同质属性集的信息(多个条目的所有相同值),请考虑使用自定义类(您可以添加方法)或collections.namedtuple() generated class跟踪这些字段:

from collections import namedtuple

ConfigEntry = namedtuple('ConfigEntry', 'append_dir_to_filename raw_file')

config = {
    'g7': ConfigEntry(1, ('cr2', 'jpg', 'mp4')),
    'd5': ConfigEntry(1, ('nef', 'jpg', 'avi')),
    'a9': ConfigEntry(1, ('mp4', 'jpg', 'avi')),
}    

# printing a specific value
print(config['d5'].raw_file)

# printing the same value for each entry
for entry in config.values():
    print(entry.append_dir_to_filename)