【问题标题】:Get parents keys from nested dictionary从嵌套字典中获取父键
【发布时间】:2013-02-19 01:09:23
【问题描述】:

从下面的嵌套字典中,如何获取'value4ac' 的每个父字典键?通过启动'value4ac' 值,我想得到'key4''key4a''Key4ac'

example_dict = { 'key1' : 'value1',
                 'key2' : 'value2',
                 'key3' : { 'key3a': 'value3a' },
                 'key4' : { 'key4a': { 
                                         'key4aa': 'value4aa',
                                         'key4ab': 'value4ab',
                                         'key4ac': 'value4ac'
                                     },
                            'key4b': 'value4b'
                           }
                   } 

【问题讨论】:

  • 键名背后有逻辑吗?我的意思是,你知道'key4ac' 会在dict 中被key4“引用”吗?

标签: python dictionary nested


【解决方案1】:

递归救援!

example_dict = { 'key1' : 'value1',
                 'key2' : 'value2',
                 'key3' : { 'key3a': 'value3a' },
                 'key4' : { 'key4a': { 'key4aa': 'value4aa',
                                       'key4ab': 'value4ab',
                                       'key4ac': 'value4ac'},
                            'key4b': 'value4b'}
                }

def find_key(d, value):
    for k,v in d.items():
        if isinstance(v, dict):
            p = find_key(v, value)
            if p:
                return [k] + p
        elif v == value:
            return [k]

print find_key(example_dict,'value4ac')

工作原理

查看物品并检查 2 个案例

  • item 不是字典——在这种情况下,看看它是否是我们正在寻找的值。如果是,则返回一个仅包含键的列表。 (这是我们递归的基本情况)。
  • item 是一个字典 -- 尝试在该字典中查找键。如果在该字典(或任何子字典)中找到它,则返回将正确路径预先附加到路径其余部分的键。

【讨论】:

  • def find_key(d,key): 你的意思是def find_key(d,value):,对吗?
  • @zelusp -- 是的,那个变量的名字是......不幸。 :-)。感谢您的建议。
  • 如何查找多次出现?例如带有关键路径的列表列表。例如:[['key4', 'key4a', 'key4ac'], ['key5, 'key5a', 'key5ac']]
【解决方案2】:

如果您的字典也包含列表怎么办?

这是@mgilson 解决方案的一个更广泛的变体,适用于 JSON:

example_dict_with_list = { 'key1' : 'value1',
                           'key2' : 'value2',
                           'key3' : { 'key3a': 'value3a' },
                           'key4' : { 'key4a': [{ 'key4aa': 'value4aa',
                                                  'key4ab': 'value4ab',
                                                  'key4ac': 'value4ac'}],
                                      'key4b': 'value4b'}
                          }

def breadcrumb(json_dict_or_list, value):
  if json_dict_or_list == value:
    return [json_dict_or_list]
  elif isinstance(json_dict_or_list, dict):
    for k, v in json_dict_or_list.items():
      p = breadcrumb(v, value)
      if p:
        return [k] + p
  elif isinstance(json_dict_or_list, list):
    lst = json_dict_or_list
    for i in range(len(lst)):
      p = breadcrumb(lst[i], value)
      if p:
        return [str(i)] + p

print(
    breadcrumb(example_dict_with_list, 'value4aa')
)

返回

['key4', 'key4a', '0', 'key4aa', 'value4aa']

奖金

如果你需要很好地打印出来,就像一串面包屑,那么做

print(
  ' > '.join(
    breadcrumb(example_dict, 'value4aa')
  )
)

哪个会返回

'key4 > key4a > 0 > key4aa > value4aa'

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-12-04
    • 2021-05-10
    • 1970-01-01
    • 1970-01-01
    • 2021-09-03
    • 1970-01-01
    • 2018-11-02
    • 2014-12-06
    相关资源
    最近更新 更多