Сравнение словарей Python

Я создал два словаря. Каждый из них основан на другом запросе одной и той же базы данных. В каждом словаре есть ключ и четыре поля из базы данных. Я хочу найти все строки dict_x, которые находятся в dict_y.

 for row in dict_x:
    if dict_y.values() not in dict_x.values():
         del dict_x[row]

print 'Length dict_x', len(dict_x)

Это возвращает ошибку

TypeError: 'type' object does not support item deletion

Что вы имеете в виду под словом "ряд"? В словарях нет строк. У них есть ключи и значения.

jpp 21.01.2019 18:24

Кроме того, вы сравниваете dict_y.values() с dict_x.values(). Это сравнение значений всего словаря на каждой итерации - конечно, не то, что вы хотите

Adam Hughes 21.01.2019 18:25

Под строкой я подразумеваю элемент словаря. Я использовал слово строка, потому что словари были сформированы из запросов SQL.

Anne Gilligan 21.01.2019 18:25

не изменится ли размер словаря во время итерации здесь или я что-то упустил

gold_cy 21.01.2019 18:26

Итак, если значения ключа/строки dict_x находятся в dict_y, то вы хотите удалить key из dict_x?

Buddy Lindsey 21.01.2019 18:27
if dict_y.values() not in dict_x.values(), вероятно, следует заменить на if dict_x[row] not in dict_y.values().
KuboMD 21.01.2019 18:28

поэтому, если это список словаря, который вы кодируете, выглядит более или менее хорошо, вы делаете del dict_x[row], но вы не можете передать строку, вам нужно передать индекс строки; но будьте осторожны, вы удаляете из того же списка, что и итерация, поэтому это вызовет скачок строки, потому что, если вы удалите строку 2, строка 3 станет строкой 2, а на следующей итерации вы потеряете ее, потому что следующая итерация будет включена ряд 3

Carlo 1585 21.01.2019 18:30

Мне нужны строки с одинаковыми значениями, их ключи будут разными.

Anne Gilligan 21.01.2019 18:31

Я также был бы в порядке с созданием нового словаря с выводом.

Anne Gilligan 21.01.2019 18:32

У меня также были проблемы с добавлением этих «строк» ​​в новый диктофон.

Anne Gilligan 21.01.2019 18:32

приведите пример ввода и вывода в своих вопросах, чтобы облегчить ответ тем, кто отвечает

Kannappan Sirchabesan 21.01.2019 19:25
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
11
234
4

Ответы 4

Шаги для решения проблемы будут заключаться в

  1. Invert the key value pairs of the dictionaries
  2. Identify the common intersecting keys
  3. Loop through the keys and check if their values match

Код может выглядеть примерно так, как показано ниже

dict_x = {v: k for k, v in dict_x.items()}
dict_y = {v: k for k, v in dict_y.items()}

for key in dict_x.keys() & dict_y.keys():
   print(key, dict_x[key])
   print(key, dict_y[key])

Вот эквивалент понимания dict в python 3

result_set = {key: dict_x[key] for key in dict_x.keys() & dict_y.keys() if dict_x[key] == dict_y[key]}

Я не думаю, что это сработает, потому что элементы должны иметь разные ключи в зависимости от запросов, которые я использовал для формирования словарей. Мне нужно найти, какие элементы имеют одинаковые значения независимо от их ключей. Если есть элемент, чьи значения не существуют в одном словаре, я хочу их удалить.

Anne Gilligan 21.01.2019 18:39

ваши значения кортеж или список?

Kannappan Sirchabesan 21.01.2019 18:42

что, если у вас есть ряд значений, которые повторяются в одной таблице?

Kannappan Sirchabesan 21.01.2019 18:46

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

Anne Gilligan 21.01.2019 18:46

как ты их тянешь? вы можете сделать type(dict[row]) в одной из строк, чтобы проверить это.

Kannappan Sirchabesan 21.01.2019 18:48

мой запрос должен был удалить дубликаты (в dict_y), так что это касается только dict_x.

Anne Gilligan 21.01.2019 18:48

какая версия питона?

Kannappan Sirchabesan 21.01.2019 18:51

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

Kannappan Sirchabesan 21.01.2019 19:18

Трассировка (последний последний вызов): Файл «X:/UserFolders/AnneGilligan/autoplots-2/atp-2.py», строка 99, в <module> для ключа в Lease_dict.keys() и reference_dict.keys(): TypeError: неподдерживаемые типы операндов для &: 'список' и 'список' .......... получили эту ошибку при попытке использовать этот метод. Я использую питон 2.7

Anne Gilligan 21.01.2019 20:04

попробуйте использовать set(lease_dict.keys()) и set(reference_dict.keys())

Kannappan Sirchabesan 21.01.2019 20:09

Вы в состоянии достичь решения, которое вы ожидали?

Kannappan Sirchabesan 21.01.2019 20:14

я хотел бы добавить все все экземпляры, где инвертированные ключи равны новому словарю

Anne Gilligan 21.01.2019 20:26

начните с пустого словаря d = {} и начните добавлять пары ключ-значение в цикл for. вы можете сослаться на stackoverflow.com/questions/6416131/…

Kannappan Sirchabesan 21.01.2019 21:33
>>> dict_a = {'a':[1,1,2,3]}
>>> dict_b = {'b':[1,2]}
>>> for a_key, b_key in zip(dict_a.keys(), dict_b.keys()):
...     print [i for i in dict_a[a_key] if i in set(dict_b[b_key])]
... 
[1, 1, 2]

будет ли это игнорироваться, если ключи разные?

Anne Gilligan 21.01.2019 18:34

есть проблема с этим ответом. что делать, если столбцы имеют повторяющиеся значения?

Kannappan Sirchabesan 21.01.2019 18:36

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

dict_x = {'hi': ['hello', 'hi'], 'bye': ['good bye', 'bye']}
dict_y = {'hi': ['hello', 'hi']}
dict_z = dict()

for key, row in dict_x.items():
    if row in dict_y.values():
         dict_z[key] = row
print(dict_z)

Если элементы не будут в том же порядке, вам придется сделать это:

dict_x = {'hi': ['hi', 'hello'], 'bye': ['good bye', 'bye']}
dict_y = {'hi': ['hello', 'hi']}
dict_z = dict()

for x_key, x_row in dict_x.items():
    for y_key, y_row in dict_y.items():
        if set(x_row).intersection(y_row):
            dict_z[x_key] = y_row

print(dict_z)

Это может помочь, он вернет False, если dict равен и true, если нет. Я знаю, что все наоборот

def compare_dict(
    dict_1: Dict[Any, Any], dict_2: Dict[Any, Any]
):
    new_key = any([False if key in dict_1 else True for key in dict_2])
    delete_key = any(
        [False if key in dict_2 else True for key in dict_1]
    )

    if new_key or delete_key:
        return True
    else:
        values_mismatch_flag = any(
            [
                True if v != dict_1[k] else False
                for k, v in dict_2.items()
            ]
        )
        if values_mismatch_flag:
            return True
        return False

Другие вопросы по теме