python比较2个字典并显示两者的差异作为结果

ruyhziif  于 2023-05-16  发布在  Python
关注(0)|答案(1)|浏览(63)

我有两本字典需要比较一下。应该找出A-B和B-A之间的差别.结果应显示如下...
我写了代码,但看起来太复杂了。我想知道如何重构代码使其看起来简单而优雅。
巨蟒

def get_sd_db_stepids_difference(source_dict=None, db_dict=None):
    NONE = None
    algo_list_db = set(source_dict.keys())
    algo_list_sd = set(db_dict.keys())
    get_all_keys_sd_db=list(algo_list_db.union(algo_list_db,algo_list_sd))
    result_enabled={}
    result_disabled = {}
    for algo_name in get_all_keys_sd_db:
        is_key_present_db = algo_name in source_dict
        is_Key_Present_sd = algo_name in db_dict
        if  is_key_present_db == is_Key_Present_sd:
            car_diff_enabled = set(source_dict.get(algo_name, NONE)) - set(db_dict.get(algo_name, NONE))
            car_diff_disabled = set(db_dict.get(algo_name, NONE)) - set(source_dict.get(algo_name, NONE))
            result_enabled[algo_name] = ' ' if len(car_diff_disabled) == 0 else list(car_diff_disabled)
            result_disabled[algo_name] = ' ' if len(car_diff_enabled) == 0 else list(car_diff_enabled)
        elif is_Key_Present_sd==1 and  is_key_present_db==0:
            car_diff_enabled = list(db_dict.get(algo_name, NONE))
            result_enabled[algo_name] = car_diff_enabled
        elif is_Key_Present_sd == 0 and is_key_present_db == 1:
            car_diff_enabled = list(source_dict.get(algo_name, NONE))
            result_enabled[algo_name] = car_diff_enabled
    return  str(result_enabled),str(result_disabled)

before_data= {
    'electric': ['benz1', 'benz2'], 'petrol': ['bmw1', 'bmw2', 'bmw3'], '': ['jaggur1', 'jaggur2','jaggur3']
}
after_data= {
    'electric': ['benz1'], 'petrol': ['bmw1','bmw2','bmw3','benz4'], '': ['jaggur4'], 'gas':['ferrai1']
}

# Output that I expect: 
#
# Data that has been added
enabled_data {'': ['jaggur4'], 'gas': ['ferrai1'], 'petrol': ['benz4'], 'electric': ' '}
disabled_data {'': ['jaggur2', 'jaggur1', 'jaggur3'], 'petrol': ' ', 'electric': ['benz2']}

非常感谢您的意见和建议!
为了以防万一,我使用Python 2.7。

ncecgwcz

ncecgwcz1#

一旦你更新到Python 3.8+(你真的应该这样做),然后...

before_data= {
    'electric': ['benz1', 'benz2'],
    'petrol': ['bmw1', 'bmw2', 'bmw3'],
    '': ['jaggur1', 'jaggur2','jaggur3']
}
after_data= {
    'electric': ['benz1'],
    'petrol': ['bmw1','bmw2','bmw3','benz4'],
    '': ['jaggur4'],
    'gas':['ferrai1']
}

def compare(a, b):
    result = {}
    for k, v in a.items():
        if (_v := b.get(k)) is not None:
            if diff := set(v) - set(_v):
                result[k] = list(diff)
            else:
                result[k] = ' '
        else:
            result[k] = v
    return result

print(compare(before_data, after_data))
print(compare(after_data, before_data))

输出:

{'electric': ['benz2'], 'petrol': ' ', '': ['jaggur1', 'jaggur2', 'jaggur3']}
{'electric': ' ', 'petrol': ['benz4'], '': ['jaggur4'], 'gas': ['ferrai1']}

相关问题