Подсчет количества элементов в словаре Python
Операции len(dict) возвращает количество элементов в словаре dict .
len(dictview) так же возвращает количество элементов в словаре, если dictview является представлением словаря dict , таким как dict.keys() , dict.values() и dict.items() .
Примеры получения длины словаря (количества элементов в словаре):
>>> x = "one": 1, "two": 2, "three": 3, "four": 4> >>> len(x) # 4 >>> keys = x.keys() >>> len(keys) # 4 >>> values = x.values() >>> len(values) # 4 >>> items = x.items() >>> len(items) # 4
- ОБЗОРНАЯ СТРАНИЦА РАЗДЕЛА
- Представления словарей dict.keys, dict.values и dict.items
- Исходный словарь для представления dictview.mapping
- Получение списка ключей словаря list(dict)
- Количество элементов в словаре len(dict)
- Доступ к значению словаря по ключу dict[key]
- Добавление/изменение значения словаря по ключу key
- Удаление значения словаря по ключу
- Проверка наличия/отсутствия ключа key в словаре dict
- Проверка наличия/отсутствия значения value в словаре Python
- Проверка наличия/отсутствия пары (key, value) в словаре dict
- Итерирование по ключам и значениям словаря Python
- Метод dict.clear(). Очистить словарь
- Метод dict.copy(), копия словаря
- Метод dict.fromkeys(), словарь с ключами по умолчанию
- Метод dict.get(), значение по умолчанию если ключа нет
- Метод dict.items(), список кортежей
- Метод dict.keys(), список ключей словаря
- Метод dict.values(), список значений словаря
- Метод dict.pop()
- Метод dict.popitem(), получить пару ключ/значение
- Метод dict.setdefault(), получает/вставляет значение ключа
- Метод dict.update(), обновление/дополнение словаря
- Объединение двух словарей в новый словарь Python
- Сортировка словаря по значению и/или ключу
- Обратный порядок/реверс словаря reversed(dict)
- Генератор словаря и его использование
- Фильтр словаря по ключам и/или значениям
- Словарь как фабрика функций
ХОЧУ ПОМОЧЬ
ПРОЕКТУ
Посчитать количество элементов в словаре с вложениями
Как наиболее оптимально перебрать весь словарь и посчитать количество отдельных элементов, чтобы не писать слишком много циклов. Конечным значением может быть либо список (добавлять длину списка), либо строка (добавлять 1 элемент) Пока что вижу такую реализацию:
c = 0 for k in all_val.keys(): if type(all_val[k]) == list: c += len(all_val[k]) elif type(all_val[k]) == str: c += 1 else: for k2 in all_val[k]: if type(all_val[k][k2]) == list: c += len(all_val[k][k2]) elif type(all_val[k][k2]) == str: c += 1 else: for k3 in all_val[k][k2]: if type(all_val[k][k2][k3]) == list: c += len(all_val[k][k2][k3]) elif type(all_val[k][k2][k3]) == str: c += 1 else: for k4 in all_val[k][k2][k3]: if type(all_val[k][k2][k3][k4]) == list: c += len(all_val[k][k2][k3][k4]) elif type(all_val[k][k2][k3][k4]) == str: c += 1
Отслеживать
задан 20 фев 2023 в 13:08
Елена Сергеева Елена Сергеева
505 3 3 серебряных знака 10 10 бронзовых знаков
воспользуйтесь рекурсией
20 фев 2023 в 13:09
1 ответ 1
Сортировка: Сброс на вариант по умолчанию
Вы можете рекурсивно обойти весь словарь. Вот возможный пример решения. Функция пройдется по всем уровням вложений и посчитает количество элементов в Вашем словаре.
def count_elements(my_dict): c = 0 for v in my_dict.values(): if isinstance(v, dict): c += count_elements(v) elif isinstance(v, list): c += len(v) elif isinstance(v, str): c += 1 return c
my_dict = , 't': >, 'b': <'q': , 'y': , 'k': >, ['1', '2', '3'. ], 'c': <'c': , 'm': >> c = count_elements(my_dict) print(c)
dict (словарь)
obj — Первым необязательным позиционным аргументом может являться отображение или итерирующийся объект (при этом каждый его элемент должен быть тоже итерирующемся и содержать ровно два объекта).
**kwargs — Поддерживаются также необязательные именованные аргументы. При использовании вкупе с позиционными аргументами и совпадении ключей значениями из именованных пользуются приоритетом.
Словари являются отображениями.
Словари являются изменяемыми объектами.
Объявление
В коде словари могут быть объявлены при помощи фигурных скобок — <> .
my_dict = 'key': 'value',
'sub_dict': <>,
2: [1, 2, 3, 4],
>
# Словарь как слияние других словарей
dict_one =
dict_two =
my_dict = **dict_one,
**dict_two,
> #
Кроме того, можно объявить их при помощи конструктора dict().
# Пустой словарь.
my_dict = dict()
# Словарь из итерирующегося объекта.
my_dict = dict(zip(['one', 'two', 'three'], [1, 2, 3]))
# Словарь из именованных аргументов.
my_dict = dict(one=1, two=2, three=3)
# Словарь из списка кортежей.
my_dict = dict([('two', 2), ('one', 1), ('three', 3)])
Ключи
Ключами словаря могут являться только объекты, поддерживающие хеширование. Таким образом, использовать в качестве ключей списки, словари и другие изменяемые типы не получится.
Если в словарь будут добавлены несколько значений с одним и тем же ключом, словарь сохранит последнее.
Не рекомендуется использоваться в качестве ключей числа с плавающей запятой, так как они хранятся в памяти в виде приближений.
Порядок ключей
Данные в обычном словаре упорядочены по очередности добавления ключей, начиная с +py3.6 (в +py2.7 — не упорядочены, но последовательность детерминирована, воспроизводима; в +py3.5 — не упорядочены, последовательность не детерминирована, не воспроизводима между запусками).
Если требуется хранить порядок, в котором в словарь были добавлены элементы (например для обхода этих элементов), следует использовать collections.OrderedDict().
Значения
В качестве значений могут использоваться любые объекты.
Получение значений
Доступ к значениям производится при помощи ключей.
Если ключ отсутствует в словаре, возбуждается исключение KeyError.
+py2.5 Чтобы изменить это поведение можно в наследнике dict определить метод __missing__(key), в котором описать нужные действия при отсутствии ключа.
my_dict =
my_value = my_dict['key'] # value
Установка значений
Кроме установки значений при создании словаря, можно дополнять его по мере надобности.
my_dict =
my_dict['new_key'] = 'new_value' # Добавляем новый элемент словаря.
Определение наличия/отсутствия элемента
+py2.2 Определить, присутствует ли ключ в словаре можно при помощи конструкции in.
+py2.2 Определить, отсутствует ли ключ в словаре можно при помощи антонимичной конструкции not in.
my_dict =
# in
# Ключ 'key' существует, поэтому 'my_key_present' True
my_key_present = 'key' in my_dict
# Ключ 'another_key' отсутствует в словаре, поэтому 'my_key_present' False
my_key_present = 'another_key' in my_dict
# not in
# Ключ 'key' существует, поэтому 'my_key_absent' False
my_key_absent = 'key' not in my_dict
# Ключ 'another_key' отсутствует в словаре, поэтому 'my_key_absent' True
my_key_absent = 'another_key' not in my_dict
Количество элементов в словаре
Количество элементов можно получить, используя функцию len().
my_dict =
my_dict_length = len(my_dict) # 1
Детали реализации CPython
Словари реализованы при помощи динамических хеш-таблиц. По сравнению с двоичными деревьями, это, в большинстве случаев, даёт выигрыш при получшении значений (наиболее часто используемая операция); кроме этого упрошается реализация.
Для каждого ключа при помощи функции hash() вычисляется хеш-код. Код этот широко варьируется в зависимости от ключа и данных процесса (например, хеш для «Python» может быть -539294296 , в то время как для «python» — отличается от первого одним битом — он будет 1142331976 ). Хеш используется для определения места (во внутреннем массиве), где хранится значение. В случае если все используемые вами ключи будут иметь различные хеши, для получения значения по ключу будет затрачено постоянное время — O(1).
На заметку
О сложности основных операций для данного типа можно узнать из статьи «Сложность операций со словарями».
Dictionary (Словари)
Словарь (неупорядоченные коллекции из разных объектов с доступом по ключу) создаётся при помощи фигурных скобок, внутри которых указываются пары «ключ-значение» через запятые. Также можно создать пустой словарь и позже добавлять пары. В Python словарь определён в классе dict. Иногда используют термин ассоциативные массивы или хеш-таблицы.
catDictionary = emptyDictionary = <>
Другие варианты создания словарей.
С помощью функции dict():
dictionary = dict(short='dict', long='dictionary') print(dictionary) # numberDict = dict([(1, 3), (2, 9)]) print(numberDict) #
С помощью метода fromkeys():
noneDictionary = dict.fromkeys(['a', 'b']) print(noneDictionary) # fullDictionary = dict.fromkeys(['a', 'b'], 9) print(fullDictionary) #
И ключи и значения в одном словаре могут быть разных типов (строки, числа).
Ключи и значения могут выводиться в различном порядке, потому что словари, в отличие от списков, не упорядочены (не ранжированы). В словаре нет первого элемента, потому что нет какого-нибудь порядка расположения элементов.
Число пар в словаре можно получить через len.
print(len(catDictionary)) # 3
Доступ к значению можно получить через ключ, указанный в квадратных скобках. Если указать неправильный ключ, то вернётся ошибка.
print(catDictionary["key3"]) # Vaska
Также можно через метод get().
val = catDictionary.get("key2") print(val) # Murzik
При не существующем ключе можно вернуть собственное сообщение.
val = catDictionary.get("key5", "That key is not found") print(val)
Проверить, есть ли проверяемый ключ в словаре можно через оператор in. В успешном случае возвращается True или 1, в противном случае возвращается False или 0.
print("key4" in catDictionary) # 0 print("key1" in catDictionary) # True
Получить все ключи можно через keys(). Метод возвращает значение типа dict_keys.
keys = catDictionary.keys() print(list(keys))
Получить все значения ключей можно через values(). Метод возвращает значение типа dict_values.
values = catDictionary.values() print(list(values)) # ['Murzik', 'Vaska', 'Barsik']
Получить все ключи со значениями можно через items().
items = catDictionary.items() print(items) # dict_items([('key2', 'Murzik'), ('key3', 'Vaska'), ('key1', 'Barsik')])
Чтобы обновить значение в словаре, нужно указать ключ и новое значение.
catDictionary["key1"] = "Ryzhik"
По такому же принципу можно добавить новый ключ со значением.
catDictionary["key4"] = "Murka"
Удалить элемент (ключ-значение) можно через оператор del. Также можно удалить весь словарь.
del catDictionary["key4"] del catDictionary
Если мы не хотим удалять сам словарь, а только очистить его от элементов, то воспользуемся методом clear().
catDictionary.clear() print(catDictionary) # <>
Выражение favorites1 == favorites2 истинно потому, что словари не упорядочены и считаются эквивалентными, если состоят из одинаковых пар ключ-значение.
Списки с одинаковыми значениями элементов, но разным порядком их следования, равны не будут.
favorites1 = favorites2 = favorites1 == favorites2 # True