英文:
python compare 2 dictionary and show difference in both as result
问题
def get_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 not car_diff_disabled else list(car_diff_disabled)
result_disabled[algo_name] = '' if not car_diff_enabled 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': ['ferrari1']
}
# Output that I expect:
# Data that has been added
enabled_data {'': ['jaggur4'], 'gas': ['ferrari1'], 'petrol': ['benz4'], 'electric': ' '}
disabled_data {'': ['jaggur2', 'jaggur1', 'jaggur3'], 'petrol': ' ', 'electric': ['benz2']}
英文:
I have two dictionaries that I need to compare. The difference should be found between A - B and B - A. The result should be shown as below...
I have written the code but it looks too complex. I wonder how can I refactor the code to look simple and elegant.
Python
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']}
Highly appreciate your inputs and suggestions!
Just in case, I'm using Python 2.7.
答案1
得分: 0
一旦您升级到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']}
英文:
Once you've updated to Python 3.8+ (which you really should do) then...
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))
Output:
{'electric': ['benz2'], 'petrol': ' ', '': ['jaggur1', 'jaggur2', 'jaggur3']}
{'electric': ' ', 'petrol': ['benz4'], '': ['jaggur4'], 'gas': ['ferrai1']}
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论