Я создал два словаря. Каждый из них основан на другом запросе одной и той же базы данных. В каждом словаре есть ключ и четыре поля из базы данных. Я хочу найти все строки 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
Кроме того, вы сравниваете dict_y.values() с dict_x.values(). Это сравнение значений всего словаря на каждой итерации - конечно, не то, что вы хотите
Под строкой я подразумеваю элемент словаря. Я использовал слово строка, потому что словари были сформированы из запросов SQL.
не изменится ли размер словаря во время итерации здесь или я что-то упустил
Итак, если значения ключа/строки dict_x находятся в dict_y, то вы хотите удалить key из dict_x?
if dict_y.values() not in dict_x.values(), вероятно, следует заменить на if dict_x[row] not in dict_y.values().
поэтому, если это список словаря, который вы кодируете, выглядит более или менее хорошо, вы делаете del dict_x[row], но вы не можете передать строку, вам нужно передать индекс строки; но будьте осторожны, вы удаляете из того же списка, что и итерация, поэтому это вызовет скачок строки, потому что, если вы удалите строку 2, строка 3 станет строкой 2, а на следующей итерации вы потеряете ее, потому что следующая итерация будет включена ряд 3
Мне нужны строки с одинаковыми значениями, их ключи будут разными.
Я также был бы в порядке с созданием нового словаря с выводом.
У меня также были проблемы с добавлением этих «строк» в новый диктофон.
приведите пример ввода и вывода в своих вопросах, чтобы облегчить ответ тем, кто отвечает






Шаги для решения проблемы будут заключаться в
- Invert the key value pairs of the dictionaries
- Identify the common intersecting keys
- 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]}
Я не думаю, что это сработает, потому что элементы должны иметь разные ключи в зависимости от запросов, которые я использовал для формирования словарей. Мне нужно найти, какие элементы имеют одинаковые значения независимо от их ключей. Если есть элемент, чьи значения не существуют в одном словаре, я хочу их удалить.
ваши значения кортеж или список?
что, если у вас есть ряд значений, которые повторяются в одной таблице?
Я просто пытался вытащить их прямо из словарей, поэтому я думаю, что ни то, ни другое? может быть, это шаг, который я пропускаю...
как ты их тянешь? вы можете сделать type(dict[row]) в одной из строк, чтобы проверить это.
мой запрос должен был удалить дубликаты (в dict_y), так что это касается только dict_x.
какая версия питона?
вы можете инвертировать два словаря, поэтому кортеж теперь будет ключом, а текущий ключ станет значением. теперь вы можете установить пересечение кортежей обоих диктов
Трассировка (последний последний вызов): Файл «X:/UserFolders/AnneGilligan/autoplots-2/atp-2.py», строка 99, в <module> для ключа в Lease_dict.keys() и reference_dict.keys(): TypeError: неподдерживаемые типы операндов для &: 'список' и 'список' .......... получили эту ошибку при попытке использовать этот метод. Я использую питон 2.7
попробуйте использовать set(lease_dict.keys()) и set(reference_dict.keys())
Вы в состоянии достичь решения, которое вы ожидали?
я хотел бы добавить все все экземпляры, где инвертированные ключи равны новому словарю
начните с пустого словаря d = {} и начните добавлять пары ключ-значение в цикл for. вы можете сослаться на stackoverflow.com/questions/6416131/…
>>> 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]
будет ли это игнорироваться, если ключи разные?
есть проблема с этим ответом. что делать, если столбцы имеют повторяющиеся значения?
Это будет работать до тех пор, пока элементы в массиве всегда будут в одном и том же порядке.
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
Что вы имеете в виду под словом "ряд"? В словарях нет строк. У них есть ключи и значения.