比较两个字典并显示它们之间的差异作为结果。

huangapple go评论97阅读模式
英文:

python compare 2 dictionary and show difference in both as result

问题

  1. def get_difference(source_dict=None, db_dict=None):
  2. NONE = None
  3. algo_list_db = set(source_dict.keys())
  4. algo_list_sd = set(db_dict.keys())
  5. get_all_keys_sd_db = list(algo_list_db.union(algo_list_db, algo_list_sd))
  6. result_enabled = {}
  7. result_disabled = {}
  8. for algo_name in get_all_keys_sd_db:
  9. is_key_present_db = algo_name in source_dict
  10. is_key_present_sd = algo_name in db_dict
  11. if is_key_present_db == is_key_present_sd:
  12. car_diff_enabled = set(source_dict.get(algo_name, NONE)) - set(db_dict.get(algo_name, NONE))
  13. car_diff_disabled = set(db_dict.get(algo_name, NONE)) - set(source_dict.get(algo_name, NONE))
  14. result_enabled[algo_name] = '' if not car_diff_disabled else list(car_diff_disabled)
  15. result_disabled[algo_name] = '' if not car_diff_enabled else list(car_diff_enabled)
  16. elif is_key_present_sd == 1 and is_key_present_db == 0:
  17. car_diff_enabled = list(db_dict.get(algo_name, NONE))
  18. result_enabled[algo_name] = car_diff_enabled
  19. elif is_key_present_sd == 0 and is_key_present_db == 1:
  20. car_diff_enabled = list(source_dict.get(algo_name, NONE))
  21. result_enabled[algo_name] = car_diff_enabled
  22. return str(result_enabled), str(result_disabled)
  23. before_data = {
  24. 'electric': ['benz1', 'benz2'], 'petrol': ['bmw1', 'bmw2', 'bmw3'], '': ['jaggur1', 'jaggur2', 'jaggur3']
  25. }
  26. after_data = {
  27. 'electric': ['benz1'], 'petrol': ['bmw1', 'bmw2', 'bmw3', 'benz4'], '': ['jaggur4'], 'gas': ['ferrari1']
  28. }
  29. # Output that I expect:
  30. # Data that has been added
  31. enabled_data {'': ['jaggur4'], 'gas': ['ferrari1'], 'petrol': ['benz4'], 'electric': ' '}
  32. 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

  1. def get_sd_db_stepids_difference(source_dict=None, db_dict=None):
  2. NONE = None
  3. algo_list_db = set(source_dict.keys())
  4. algo_list_sd = set(db_dict.keys())
  5. get_all_keys_sd_db=list(algo_list_db.union(algo_list_db,algo_list_sd))
  6. result_enabled={}
  7. result_disabled = {}
  8. for algo_name in get_all_keys_sd_db:
  9. is_key_present_db = algo_name in source_dict
  10. is_Key_Present_sd = algo_name in db_dict
  11. if is_key_present_db == is_Key_Present_sd:
  12. car_diff_enabled = set(source_dict.get(algo_name, NONE)) - set(db_dict.get(algo_name, NONE))
  13. car_diff_disabled = set(db_dict.get(algo_name, NONE)) - set(source_dict.get(algo_name, NONE))
  14. result_enabled[algo_name] = ' ' if len(car_diff_disabled) == 0 else list(car_diff_disabled)
  15. result_disabled[algo_name] = ' ' if len(car_diff_enabled) == 0 else list(car_diff_enabled)
  16. elif is_Key_Present_sd==1 and is_key_present_db==0:
  17. car_diff_enabled = list(db_dict.get(algo_name, NONE))
  18. result_enabled[algo_name] = car_diff_enabled
  19. elif is_Key_Present_sd == 0 and is_key_present_db == 1:
  20. car_diff_enabled = list(source_dict.get(algo_name, NONE))
  21. result_enabled[algo_name] = car_diff_enabled
  22. return str(result_enabled),str(result_disabled)
  23. before_data= {
  24. 'electric': ['benz1', 'benz2'], 'petrol': ['bmw1', 'bmw2', 'bmw3'], '': ['jaggur1', 'jaggur2','jaggur3']
  25. }
  26. after_data= {
  27. 'electric': ['benz1'], 'petrol': ['bmw1','bmw2','bmw3','benz4'], '': ['jaggur4'], 'gas':['ferrai1']
  28. }
  29. # Output that I expect:
  30. #
  31. # Data that has been added
  32. enabled_data {'': ['jaggur4'], 'gas': ['ferrai1'], 'petrol': ['benz4'], 'electric': ' '}
  33. 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+(确实应该这样做),然后...

  1. before_data = {
  2. 'electric': ['benz1', 'benz2'],
  3. 'petrol': ['bmw1', 'bmw2', 'bmw3'],
  4. '': ['jaggur1', 'jaggur2', 'jaggur3']
  5. }
  6. after_data = {
  7. 'electric': ['benz1'],
  8. 'petrol': ['bmw1', 'bmw2', 'bmw3', 'benz4'],
  9. '': ['jaggur4'],
  10. 'gas': ['ferrai1']
  11. }
  12. def compare(a, b):
  13. result = {}
  14. for k, v in a.items():
  15. if (_v := b.get(k)) is not None:
  16. if diff := set(v) - set(_v):
  17. result[k] = list(diff)
  18. else:
  19. result[k] = ' '
  20. else:
  21. result[k] = v
  22. return result
  23. print(compare(before_data, after_data))
  24. print(compare(after_data, before_data))

输出:

  1. {'electric': ['benz2'], 'petrol': ' ', '': ['jaggur1', 'jaggur2', 'jaggur3']}
  2. {'electric': ' ', 'petrol': ['benz4'], '': ['jaggur4'], 'gas': ['ferrai1']}
英文:

Once you've updated to Python 3.8+ (which you really should do) then...

  1. before_data= {
  2. 'electric': ['benz1', 'benz2'],
  3. 'petrol': ['bmw1', 'bmw2', 'bmw3'],
  4. '': ['jaggur1', 'jaggur2','jaggur3']
  5. }
  6. after_data= {
  7. 'electric': ['benz1'],
  8. 'petrol': ['bmw1','bmw2','bmw3','benz4'],
  9. '': ['jaggur4'],
  10. 'gas':['ferrai1']
  11. }
  12. def compare(a, b):
  13. result = {}
  14. for k, v in a.items():
  15. if (_v := b.get(k)) is not None:
  16. if diff := set(v) - set(_v):
  17. result[k] = list(diff)
  18. else:
  19. result[k] = ' '
  20. else:
  21. result[k] = v
  22. return result
  23. print(compare(before_data, after_data))
  24. print(compare(after_data, before_data))

Output:

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

huangapple
  • 本文由 发表于 2023年5月15日 01:21:37
  • 转载请务必保留本文链接:https://go.coder-hub.com/76248800.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定