Обработать словарь на основе типов его значения и сгенерировать другой словарь, используя словарное понимание
Входной словарь
{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]}