Как можно вычислить сумму всех элементов в большом вложенном словаре?

Здравствуйте! У меня есть вложенный словарь следующего вида: 

```python
dct = {
	1: {
		1: {
			1: 111,
			2: 112,
			3: 113,
		},
		2: {
			1: 121,
			2: 122,
			3: 123,
		},
	},
	2: {
		1: {
			1: 211,
			2: 212,
			3: 213,
		},
		2: {
			1: 221,
			2: 222,
			3: 223,
		},
	},
	3: {
		1: {
			1: 311,
			2: 312,
			3: 313,
		},
		2: {
			1: 321,
			2: 322,
			3: 323,
		},
	},
}
```

Я пытался решить задачу с использованием кода из другой задачи:

```python
result = 0

for n in dct:
	for m in n.values():
		for val in m:
			result += val

print(result)
```

Однако он вызывает ошибку:

```
Traceback (most recent call last):
  line 46, in 
    for m in n.values():
AttributeError: 'int' object has no attribute 'values'
```

Не могли бы вы подсказать, как правильно вычислить сумму элементов в данном словаре? Мне хотелось бы понять, как работать с такими структурами данных в будущем.
  • 2 декабря 2024 г. 9:33
Ответы на вопрос 2
Для вычисления суммы всех элементов в вложенном словаре нужно использовать правильную стратегию обхода структуры данных. Ваш код вызывает ошибку, потому что вы пытаетесь вызвать `.values()` на переменной `n`, которая является целым числом, а не словарем.

Чтобы пройти по всем уровням вложенности, можно использовать рекурсивную функцию или простой цикл. Вот пример использования рекурсивной функции для этой задачи:

```python
def sum_nested_dict(dct):
    total = 0
    for key, value in dct.items():
        if isinstance(value, dict):  # Проверяем, является ли значение словарем
            total += sum_nested_dict(value)  # Рекурсивный вызов для вложенного словаря
        else:
            total += value  # Если значение не словарь, добавляем его к общей сумме
    return total

dct = {
    1: {
        1: {
            1: 111,
            2: 112,
            3: 113,
        },
        2: {
            1: 121,
            2: 122,
            3: 123,
        },
    },
    2: {
        1: {
            1: 211,
            2: 212,
            3: 213,
        },
        2: {
            1: 221,
            2: 222,
            3: 223,
        },
    },
    3: {
        1: {
            1: 311,
            2: 312,
            3: 313,
        },
        2: {
            1: 321,
            2: 322,
            3: 323,
        },
    },
}

result = sum_nested_dict(dct)
print(result)
```

Этот код создает рекурсивную функцию `sum_nested_dict`, которая проходит по всем элементам словаря. Если элемент является словарем, функция вызывает сама себя, передавая вложенный словарь. Если элемент не является словарем, он добавляет его значение к общей переменной `total`.

В результате, вызов `sum_nested_dict(dct)` вернет сумму всех чисел в вашем словаре.
Выдаёт ошибку:

Метод values() у чисел? Может не стоит?
Подскажите как посчитать сумму элементов в данном словаре

А если глубина словаря изменится, опять все вложенные for переписывать? С рекурсией лучше выглядит:
def best_function(d):
    sum = 0
    for v in d.values():
        if isinstance(v, dict):
            sum += best_function(v)
        else:
            sum += v
    return sum

print(best_function(dct)) # 3906

Ну и как правильно подметил Влад Григорьев - почему отладкой кода не занимаетесь? А если задача будет сложнее, например в 100 раз, 100 вопросов зададите?
Похожие вопросы