簡體   English   中英

類型錯誤:python 中不可散列的 dict 同時減去兩個 dict 中的值

[英]Type Error : Unhashable dict in python while subtracting values in two dict

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}}) sum 不為零,則應在減去時直接將其插入“file_to_modify”中。

all_file_list['dir'] 包含文件名和文件修改時間。 如前所示,明智的修改文件列表包含文件名、文件修改時間和狀態字典。 所以我想根據文件名和文件修改時間減去。 因此,如果相同的文件名再次到達,它將具有不同的修改時間,因此我們應該考慮該文件並插入 file_to_modify

預期輸出 - file_to_modify = [('file1.txt', 10282020, {"data": {'status1': 1, 'status2': 0}}), ('file3.txt', 10282020, None)]

你必須操縱更多的數據,你不能只像這樣使用它

  • 臨時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)]

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM