Понимание вложенного словаря Python с помощью if else

Я пытаюсь преобразовать приведенное ниже в понимание dict

my_dict = {'a': None, 'b': None, 'c': ['1', '2', '3']}
new_dict = {}
 for k, v in my_dict.items():
     if not v:
         new_dict[k] = None
     else:
         for item in v:
             new_dict[f'{k}{item}'] = None

Я пытаюсь перевести свой дикт на

new_dict = {'a': None, 'b': None, 'c1': None, 'c2': None, 'c3': None}

Мне довольно удобно с базовым пониманием списков и диктов, но я борюсь с этим, в настоящее время выглядя примерно так, но явно я немного не в синтаксисе:

{k: None if not v else f'{k}{item}': None for item in v for k, v in my_dict.items()}

person Hemisphere    schedule 23.06.2020    source источник
comment
всегда помните Simple is better than complex и Readability counts.   -  person Vishal Singh    schedule 23.06.2020


Ответы (3)


Эта мерзость сделает:

{fk: None
 for k, v in my_dict.items()
 for fk in ([k] if v is None else (k + fv for fv in v))}

Если значение равно None, вам нужен только ключ.
Если значение не равно None, вам нужен список всех значений, объединенных с ключом.
Гомогенизируйте это, чтобы всегда возвращался список, любой из ключ или несколько:

[k] if v is None else [k + fv for fv in v]

Затем вы смотрите на простое вложенное понимание:

{k: None for k in [['a'], ['b'], ['c1', 'c2', 'c3']] for fk in k}
person deceze♦    schedule 23.06.2020

Вы можете сделать это с помощью itertools.chain.from_iterable:

>>> {
    y: None
    for y in itertools.chain.from_iterable(
            k if not v else (f"{k}{x}" for x in v) for k, v in my_dict.items()
        )
    }
{'a': None, 'b': None, 'c1': None, 'c2': None, 'c3': None}
person CDJB    schedule 23.06.2020

Я был горд своим ответом:

new_dict = dict(
    sum(
        [
            [(k, None)] if not value else [(f"{k}{v}", None) for v in value]
            for k, value in my_dict.items()
        ],
        [],
    )
)

... пока не увидел ответ deceze, который мне еще нужно переварить.

person Dr. V    schedule 23.06.2020
comment
Спасибо Вишал. ваше переформатирование может помочь прочитать код. Мое неявное предположение, когда меня спрашивают о понимании, заключается в том, что код должен быть нечитаемым :-D ... просто шучу. - person Dr. V; 23.06.2020