簡體   English   中英

嵌套字典中的值

[英]Values from nested dictionary

更新:如何訪問嵌套字典中的值,其中一個需要兩個鍵,第一個查找內部字典,第二個查找該 key2 處的值。

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

您可以通過與分配值相同的方式訪問這些值:

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

要訪問嵌套字典中的值,您需要兩個鍵:第一個key1用於查找內部字典,第二個用於查找key2處的值。

要訪問所有“拳頭鍵”(例如g7d5a9的鍵['append_dir_to_filename']的值,您必須遍歷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'])

您有嵌套字典。 您的外部字典鍵都引用了另一個字典,該字典也有鍵。 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()生成的類來跟蹤這些領域:

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)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM