Я категорически не согласен с тем, чтобы сделать логику чище или проще. Этот код очень нечитаем.

вая словарь с кортежами в качестве ключей (и числа / скаляры в качестве значений), как Pythonic способ преобразовать во вложенный словарь? Суть в том, что от ввода к вводу кортежи имеют произвольную длину.

Ниже,d1, d2, а такжеd3 продемонстрировать возрастающую вложенность:

from itertools import product

d1 = dict(zip(product('AB', [0, 1]), range(2*2)))
d2 = dict(zip(product('AB', [0, 1], [True, False]), range(2*2*2)))
d3 = dict(zip(product('CD', [0, 1], [True, False], 'AB'), range(2*2*2*2)))

И их результирующие вложенные версии будут:

# For d1
{'A': {0: 0, 1: 1}, 'B': {0: 2, 1: 3}}

# For d2
{'A': {0: {True: 0, False: 1}, 1: {True: 2, False: 3}},
 'B': {0: {True: 4, False: 5}, 1: {True: 6, False: 7}}}

# Beginning of result for d3
{
'C': {
    0: {
        True: {
            'A': 0
            'B': 1
        },
        False: {
            'A': 2,
            'B': 3
        },
    1: # ...

Мои попытки: мне нравится этот трюк для инициализации пустой структуры данных, которая дается в ряде других ответов SO:

from collections import defaultdict

def nested_dict():
    return defaultdict(nested_dict)

Но у меня возникли проблемы с реализацией этого, потому что количество уровней является неопределенным. Я мог бы использовать что-то вроде:

def nest(d: dict) -> dict:
    res = nested_dict()
    for (i, j, k), v in d.items():
        res[i][j][k] = v
    return res

Но это было бытолько работать наd2 потому что его ключи имеют 3 уровня (i, j, k) выше.

Вот моя попытка найти решение для обобщения этого, но я предполагаю, что есть более простой маршрут.

def set_arbitrary_nest(keys, value):
    """
    >>> keys = 1, 2, 3
    >>> value = 5
    result --> {1: {2: {3: 5}}}
    """

    it = iter(keys)
    last = next(it)
    res = {last: {}}
    lvl = res
    while True:
        try:
            k = next(it)
            lvl = lvl[last]
            lvl[k] = {}
            last = k
        except StopIteration:
            lvl[k] = value
            return res

>>> set_arbitrary_nest([1, 2, 3], 5)
{1: {2: {3: 5}}}

Ответы на вопрос(2)

Ваш ответ на вопрос