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
答案 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']
,g7
,d5
等所有“拳头密钥”访问密钥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)