Ошибка типа: Unhashable dict в python при вычитании значений в двух dict

#python

#python

Вопрос:

 all_files_list = {}
all_files_list['dir'] = [
    ('file1.txt', 10282020),
    ('file2.txt', 10282020),
    ('file3.txt', 10282020)]

modified_file_list = {}
modified_file_list['dir'] = [
    ('file1.txt', 10282020, {data : {'status1' : 1, 'status2' : 0}}),
    ('file2.txt', 10282020, {data : {'status3' : 0, 'status4' : 0}}),
    (None, None, None)]

file_to_modify = list(set(all_files_list['dir']) - set(modified_file_list['dir']))
  

когда я делаю это, он выдает Type Error : Unhashable type: 'dict'

Требование — Из modified_file_list[‘dir’] мы должны вычитать только те файлы, сумма статуса которых равна = 0. статус имени ключа может быть разным каждый раз.

например: ('file2.txt', 10282020, {data : {'status3' : 0, 'status4' : 0}}) сумма статусов 3 и 4 равна нулю, поэтому мы можем вычесть эти файлы и не вставлять их в «file_to_modify».

но ('file1.txt', 10282020, {data : {'status1' : 1, 'status2' : 0}}) если сумма не равна нулю, то непосредственно это должно быть вставлено в «file_to_modify» при вычитании.

all_file_list[‘dir’] содержит имя файла и время изменения файла. как и в случае с wise, список измененных файлов содержит имя файла, время изменения файла и статус dict, как показано ранее. Итак, я хочу вычесть на основе имени файла и времени изменения файла. так что, если снова появится то же имя файла, у него будет другое время изменения, поэтому мы должны рассмотреть этот файл и вставить в file_to_modify

ожидаемый результат — file_to_modify = [(‘file1.txt ‘, 10282020, {«данные»: {‘status1’: 1, ‘status2’: 0}}), (‘file3.txt ‘, 10282020, Отсутствует)]

Ответ №1:

Вам нужно больше манипулировать данными, вы не можете использовать их только так

  • временно all_files_dict для доступа к данным all_files_list
  • временно modified_files_dict для доступа к данным modified_file_list

Затем выполните итерацию all_files_dict и используйте данные modified_files_dict , чтобы решить, сохранять их или нет

 all_files_list = {
    'dir': [('file1.txt', 10282020),
            ('file2.txt', 10282020),
            ('file3.txt', 10282020)]}

modified_file_list = {
    'dir': [('file1.txt', 10282020, {"data": {'status1': 1, 'status2': 0}}),
            ('file2.txt', 10282020, {"data": {'status3': 0, 'status4': 0}}),
            (None, None, None)]}

all_files_dict = dict(all_files_list['dir'])
modified_files_dict = {x[0]: x[1:] for x in modified_file_list['dir'] if x[0]}

file_to_modify = []
for filename, vals in all_files_dict.items():
    if filename in modified_files_dict:
        sum_status = sum(modified_files_dict[filename][1]['data'].values())
        if sum_status == 0:
            continue
    file_to_modify.append((filename, vals, modified_files_dict.get(filename, [None, None])[1]))

print(file_to_modify)
# [('file1.txt', 10282020, {"data": {'status1': 1, 'status2': 0}}), ('file3.txt', 10282020, None)]
  

Комментарии:

1. all_file_list[‘dir’] содержит имя файла и время изменения файла. как и в случае с wise, список измененных файлов содержит имя файла, время изменения файла и статус dict, как показано ранее. Итак, я хочу вычесть на основе имени файла и времени изменения файла. так что, если снова появится то же имя файла, у него будет другое время изменения, поэтому мы должны рассмотреть этот файл и вставить в file_to_modify

2. ожидаемый результат — file_to_modify = [(‘file1.txt ‘, 10282020, {«данные»: {‘status1’: 1, ‘status2’: 0}}), (‘file3.txt ‘, 10282020, Отсутствует)]

3. Это должно сработать, позвольте мне попробовать это в моем реальном коде. Спасибо 🙂