Проверка наличия данных в словаре
Имеются 3 словаря: inventData , invent101 и invent21 , которые я соединяю, делая из них 1 — inventDataAll . Хотя словари и соединяются, но дело в том, что в словаре inventData есть данные которых нет в invent101 и invent21 . Мне необходимо, чтобы скрипт печатал, какие данные он не нашел, но это не происходит. Вместо этого выводится «Инвентарник» + value[‘invent’] + «счетах не значится» именно столько раз сколько раз отрабатывает первый цикл, вне зависимости от того есть эти данные в invent101 и invent21 или нет. Хотелось получить помощь по этому поводу.
inventData = <> # 1 словарь # . inventData.setdefault(index, dict(name=name, serial=serial, invent=invent, produce=produce)) # . invent101 = <> # 2 словарь # . invent101.setdefault(index, dict(invent=invent, checked=checked, worked=worked, cost=cost)) # . invent21 = <> # 3 словарь # . invent21.setdefault(index, dict(invent=invent, checked=checked, worked=worked, cost=cost)) # . inventDataAll = <> # Итоговый словарь for key, value in inventData.items(): for key101, value101 in invent101.items(): if value['invent'] == value101['invent']: inventDataAll.setdefault(key, dict(name=value['name'], serial=value['serial'], invent=value['invent'], produce=value['produce'], checked=value101['checked'], worked=value101['worked'], cost=value101['cost'])) elif value['invent'] != value101['invent']: for key21, value21 in invent21.items(): if value['invent'] == value21['invent']: inventDataAll.setdefault(key, dict(name=value['name'], serial=value['serial'], invent=value['invent'], produce=value['produce'], checked=value21['checked'], worked=value21['worked'], cost=value21['cost'])) else: print("Инвентарник" + value['invent'] + "счетах не значится")
Отслеживать
задан 2 окт 2016 в 10:54
13 8 8 бронзовых знаков
Насколько я понимаю, else должно быть на одном уровне с if, а сейчас оно на одном уровне со внутреннем for, поэтому код в этом else срабатывает каждый раз, когда успешно завершается внутренний for.
2 окт 2016 в 12:34
Покажите структуру словарей. Возможно, есть более изящный способ найти расхождения.
3 окт 2016 в 8:50
Уважаемый @Sergey Gornostaev на счет структуры словарей, данные берутся из 3-х екселевских файлов, долго думал как объединить данные, додумался только до этого.
3 окт 2016 в 17:38
По поводу комментария товарища @insolor esle переставлял не раз во всевозможных вариациях, баловался с brake, ничего путного не выходит. я понял о чем Вы, но мне кажется все что можно я перепробовал
Проверка наличия/отсутствия значения value в словаре Python
Дополнительно смотрите метод словаря dict.values() .
Примеры проверки наличия значения в словаре:
>>> x = 'one': 0, 'two': 20, 'three': 3, 'four': 4> >>> values = x.values() >>> del x['three'] >>> 0 in values # True >>> 0 not in values # False # значение ключа, которое было удалено >>> 3 in values # False >>> 3 not in values # True
- ОБЗОРНАЯ СТРАНИЦА РАЗДЕЛА
- Представления словарей 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)
- Генератор словаря и его использование
- Фильтр словаря по ключам и/или значениям
- Словарь как фабрика функций
ХОЧУ ПОМОЧЬ
ПРОЕКТУ
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
Проверить наличие пустого набора в Python
В этом посте мы обсудим, как проверить наличие пустого множества в Python.
Python 3.x представил синтаксис для литералов множества — фигурные скобки, окружающие содержимое изменяемого множества. Однако в Python нет литерала для пустого множества. Это связано с тем, что литералы набора отличаются от словарей отсутствием пар ключ-значение (разделенных двоеточиями). Следовательно, <> синтаксис представляет пустой словарь, а set() представляет собой пустой набор.
1. Использование len() функция
Простое решение для проверки того, является ли набор пустым, использует len() функция. Возвращает общее количество элементов в наборе. Поскольку пустой набор имеет длину 0, вы можете использовать это как: