猿问

编写一个算法来计算字典中子字典的数量

我对 Python 还很陌生,并且正在为嵌套字典而苦苦挣扎。考虑一下这本词典:


d = {

  'a1': {

    'a2': [

      [1, 2, 3],

      {

        'a3': ({

          'a4': 'cv'

        }, (1, 2, 3, {

          'a5': 'c'

        }))

      }

    ]

  },

  'b1': {

    'b2': [1, 2, 3]

  },

  3: '3',

  (1, 2, 3): 'immutable'

}

如何从字典中计算子字典d。


我的算法是不正确的:


def count_dict(d):

    # print(d.items())

    return sum(1 + count_dict(v) if isinstance(v, dict) else 1 for _, v in d.items())


$> print(count_dict(d))

$> 6

并且期望结果是 9。


拉丁的传说
浏览 137回答 1
1回答

阿晨1998

您可以通过递归找到所有字典。在此之前,我必须澄清以下几点:在字典中查找而d不是在字典中查找b,对吗?如果要查找所有字典,dict示例中有 6 个。如果你想找到所有key-value pairs,它有 9 key-value pairs。所以我有正确的两个版本,一个用于dict,一个用于key-value(仅一行差异):def count_dict(d):    if isinstance(d, dict):        # count 1 if it is a dict        count = 1        # iterate values for dict        iterable = d.values()    else:        count = 0        iterable = d    for v in iterable:        if isinstance(v, dict) or isinstance(v, list) or isinstance(v, tuple) or isinstance(v, set):            # count recursively            count += count_dict(v)    return countdef count_dict_pairs(d):    if isinstance(d, dict):        # count key-value pairs if it is a dict        count = len(d)        iterable = d.values()    else:        count = 0        iterable = d    for v in iterable:        if isinstance(v, dict) or isinstance(v, list) or isinstance(v, tuple) or isinstance(v, set):            count += count_dict(v)    return countdef test():    d = {        'a1': {            'a2': [                [1, 2, 3],                {                    'a3': ({                               'a4': 'cv'                           }, (1, 2, 3, {                        'a5': 'c'                    }))                }            ]        },        'b1': {            'b2': [1, 2, 3]        },        3: '3',        (1, 2, 3): 'immutable'    }    print(count_dict(d))   # output 6    print(count_dict_pairs(d))   # output 9希望对你有帮助。
随时随地看视频慕课网APP

相关分类

Python
我要回答