Обработать словарь на основе типов его значения и сгенерировать другой словарь, используя словарное понимание

Входной словарь

{11: [1, 2], 23: 'ewewe', 3: [4], 41: 5, 55: 6}

Мне нужно сформировать другой словарь, основанный на типах элементов входного словаря, это будет выглядеть так:

{type: list of keys which has this type}

Ожидаемый результат будет

{<type 'list'>: [11, 3], <type 'str'>: [23], <type 'int'>: [41, 55]}

Я написал ниже код для этого:-

input_dict = {1: [1, 2], 2: 'ewewe', 3: [4], 4: 5, 5: 6}
>>> d = {}
>>> seen = []
for key,val in input_dict.items():
    if type(val) in seen:
        d[type(val)].append(key)
    else:
        seen.append(type(val))
        d[type(val)] = [key]
>>> d
{<type 'list'>: [1, 3], <type 'str'>: [2], <type 'int'>: [4, 5]}

Я пытаюсь заменить вышеприведенный код на словарное понимание, я не мог сделать это после нескольких часов, любая помощь будет оценена. Заранее спасибо...

2 ответа

Решение

Вы не можете сделать это с пониманием словаря (только с одним), вместо этого как более питонический способ, которым вы можете использовать collections.defaultdict():

>>> from collections import defaultdict
>>> d = defaultdict(list)
>>> 
>>> test = {11: [1, 2], 23: 'ewewe', 3: [4], 41: 5, 55: 6}
>>> 
>>> for i, j in test.items():
...     d[type(j)].append(i)
... 
>>> d
defaultdict(<type 'list'>, {<type 'list'>: [3, 11], <type 'str'>: [23], <type 'int'>: [41, 55]})
>>> 

С помощью defaultdict и словарное понимание (вид):

from collections import defaultdict

input_dict = {1: [1, 2], 2: 'ewewe', 3: [4], 4: 5, 5: 6}

d = defaultdict(list)
{d[type(value)].append(key) for key, value in input_dict.items()}
d = dict(d)

print(d)

Выход

{<type 'list'>: [1, 3], <type 'int'>: [4, 5], <type 'str'>: [2]}
Другие вопросы по тегам