【问题标题】:Values from nested dictionary嵌套字典中的值
【发布时间】:2017-11-10 08:15:15
【问题描述】:

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

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

【问题讨论】:

  • Values with double keys 是错误的,因为 python 中没有这样的东西。我假设您的意思是键 value 作为字典。
  • 我认为 OP 的意思是如何访问嵌套字典中的值,您需要两个键,第一个找到内部 dict,第二个找到该 key2 处的值跨度>
  • 他就是这个意思,是的,作者应该熟悉一些基本概念
  • 感谢您的澄清。我想知道字典结构是否有效或者我需要重新组织?
  • @HakariDo:使用像命名元组这样的结构化对象将更容易检测您何时忘记输入字段;字典是任意结构,很容易漏掉键名中的拼写错误。

标签: python dictionary


【解决方案1】:

您有嵌套字典。您的外部字典键都引用另一个字典,然后它也有键。 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)

【讨论】:

  • 谢谢,非常有用的东西!关于“同质属性集”,请参阅 OP 的底部,这些是我需要使用的键和值。
  • @HakariDo:只需扩展namedtuple() 的第二个参数,它定义了结果类(和顺序)的字段。请注意,('stringvalue') 只会产生 'stringvalue',这不是单值元组。如果to_else_filelwt 是元组,你需要一个逗号:('stringvalue',);括号只是为了帮助分组。
  • 很好的建议 @martijnPieters 使用 namedtuples 或一个类来跟踪数据字段,以及 tks 的帮助。
【解决方案2】:

您访问这些值的方式与分配它们的方式相同:

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

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

要访问所有“拳头键”(例如 g7d5a9)的键 ['append_dir_to_filename'] 的值,您必须遍历 config,得到 key1,然后阅读所需位置的值:

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

编辑:

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

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

【讨论】:

  • 谢谢。关于我在 OP 中的第二个问题(获取“所有“拳头键”的“['append_dir_to_filename'] 值”,例如g7, d5, a9”):您如何为 all 键调用 append_dir_to_filename?例如,当只想将目录名称附加到图像文件名的一部分相机时,基于append_dir_to_filename 中的01 值?
  • 我想我是在您发表评论时回复了第二部分。请让我知道是否清楚。
  • 循环时不需要使用dict.keys()for key1 in config 为您提供完全相同的结果,而无需进行额外的方法调用和对象创建。
  • 但是,如果您要做的只是查看 ,那么为什么还要遍历键呢?只需循环 dict.values() 并为自己节省重复的 config[key1] 查找。
  • @reblochon-masque:谢谢!非常清楚和切中要害。你统治!
猜你喜欢
  • 1970-01-01
  • 2018-01-29
  • 2023-04-03
  • 1970-01-01
  • 2018-05-31
  • 2018-09-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多