编写算法以计算字典中子词典的数量

时间:2019-03-29 08:20:36

标签: python python-3.x dictionary

我对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。

1 个答案:

答案 0 :(得分:1)

您可以通过递归找到所有字典。在此之前,我必须澄清以下几点:

  1. 不是在字典d中找到字典b,对吗?
  2. 如果要查找所有字典,则在示例中有6个dict。如果要查找所有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 count


def 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 count

def 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

希望它能对您有所帮助。