Дан словарь с элементами разных типов
{'в': 1, 7: [1,5], 'у': 'abc', '9': []}
Нужно вывести словарь вида
{имя_типа : количество_элементов_этого_типа}
Дан словарь с элементами разных типов
{'в': 1, 7: [1,5], 'у': 'abc', '9': []}
Нужно вывести словарь вида
{имя_типа : количество_элементов_этого_типа}
from collections import Counter
data = {'в': 1, 7: [1,5], 'у': 'abc', '9': []}
counter = Counter(type(v).__name__ for k, v in data.items())
print(dict(counter)) # преобразуем в обычный словарь для вывода в нужном формате.
# type str
type_str_val = 0
# type int
type_int_val = 0
# type float
type_float_val = 0
#type tuple
type_tuple_val = 0
# словарть который идет на выход, пока значение всех ключей None.
return_dict = {
"type_int": None,
"type_str": None,
"type_float": None,
"type_tuple": None,
}
slovar = {
1: 10,
2: 15,
1.4: 4.5,
"str": 'value',
(1,): "typle",
"value_list": [1, 2, 3, 4, 5],
"value_dict": {1: 2, "str": "value_str"}
}
# приходим по словарю
for key, value in slovar.items():
if type(key) == str:
type_str_val += 1 # если есть ключ, то и есть значение.
if type(key) == int:
type_int_val += 1
if type(key) == float:
type_float_val += 1
if type(key) == tuple:
type_tuple_val += 1
# Обновляем словарть новыми значаниями
return_dict["type_int"] = type_int_val
return_dict["type_str"] = type_str_val
return_dict["type_float"] = type_float_val
return_dict["type_tuple"] = type_tuple_val
print(return_dict)
Результат работы:
{'type_int': 2, 'type_str': 3, 'type_float': 1, 'type_tuple': 1}
На будущее, список книг:
1) введите сюда описание ссылки
2) введите сюда описание ссылки
3) введите сюда описание ссылки
... "type_int": 0, ..., а при обработке вместо type_str_val += 1 будет return_dict["type_str"] += 1 2) Нужно подправить в ссылках название "введите сюда описание ссылки"Если же вам необходимо просто посчитать типы значений словаря только на первом уровне обратите внимание на ответ godva.
Если я правильно понял то нам нужно узнать типы всех элементов как ключей так и значений, по этому для удобства переводим ключи и значения в линейный список.
Думаю разобраться в коде труда не составит. Из того что может не знать новичок здесь только isinstanceсравнивающий класс переменной и передаваемого вторым аргументом класса, а так же get метод словаря возвращающий значение по ключу переданному первым аргументом или если ключа нет в словаре значение второго аргумента, либо None, если второго аргумента нет.
def inline_key_value_array(dic):
# Помните, использование глобальных переменных внутри функций не лучшая практика.
types[type(dic).__name__] = types.get(type(dic).__name__, 0) + 1
result = []
for key, value in dic.items():
result.append(key)
if isinstance(value, dict):
result += inline_key_value_array(value)
elif isinstance(value, set) or isinstance(value, tuple) or isinstance(value, list):
result += inline_value_array(value)
else:
result.append(value)
return result
def inline_value_array(lst):
# Помните, использование глобальных переменных внутри функций не лучшая практика.
types[type(lst).__name__] = types.get(type(lst).__name__, 0) + 1
result = []
for value in lst:
if isinstance(value, dict):
result += inline_key_value_array(value)
elif isinstance(value, set) or isinstance(value, tuple) or isinstance(value, list):
result += inline_value_array(value)
else:
result.append(value)
return result
types = {}
input_dic = {'в': 1, 7: [1,5], 'у': {'в': 1, 7: [1,5], 'у': 'abc', '9': [1]}, '9': {2, 5}}
# Разворачием словарь в линейный список
input_list = inline_key_value_array(input_dic)
for i in input_list:
# Получаем название типа и подставляем его как ключ. Так же используем .get на случай если значение словаря не объявлено.
types[type(i).__name__] = types.get(type(i).__name__, 0) + 1
print(types)