#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. Это должно сработать, позвольте мне попробовать это в моем реальном коде. Спасибо 🙂