Написать алгоритм для подсчета количества вложенных словарей в словаре

#python #python-3.x #dictionary

#python #python-3.x #словарь

Вопрос:

Я довольно новичок в 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. Я слепой или в этом dict нет «b»?

2. В d ( d включено) всего 6 dicts, если я правильно их посчитаю

3. да, я думаю, возможно, он имеет в виду, сколько пар ключ-значение, это 9 для пар ключ-значение. @pLOPeGG

Ответ №1:

Вы можете найти все dict с помощью рекурсии. Перед этим я должен кое-что уточнить:

  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
  

Надеюсь, это поможет вам.

Комментарии:

1. Большое вам спасибо, я имел в виду пары ключ-значение, и я перепутал концепцию словаря python.