首页 > 解决方案 > 您如何比较包含不可散列对象的字典?

问题描述

每个标题。我有 2 个字典,它们都包含列表:

d1 = {'AES': [256], 'Blowfish': [224, 448]} 
d2 = {'AES': [128, 192, 256], 'Blowfish': [112, 224, 448], 'DES': [56]}

理想的结果应该是清晰且易于使用的;函数输出格式规定为 (str, int) 的元组,但我更关注如何比较它们并获得易于使用的结果。

作为记录,期望的结果应该表明上面唯一支持的加密格式是 AES 256 和 Blowfish 224 和 Blowfish 448

我觉得我应该补充一点,我的 python 版本是 3.6.8

附录:我觉得我说的不是很清楚,我很抱歉。我正在处理的函数将获取比较结果并选择具有最大值的密钥、值对(本质上,它根据密钥长度选择要使用的密码系统)。它将选择输出为一个元组,在本例中为 (Blowfish, 448)。我只是对比较部分更感兴趣,但我觉得我的清晰度不够好,所以再次道歉。

标签: python-3.x

解决方案


这应该有效:

def intersection(obj1, obj2): 
  return list(set(obj1) & set(obj2)) 

d1 = {'AES': [256], 'Blowfish': [224, 448]}
d2 = {'AES': [128, 192, 256], 'Blowfish': [112, 224, 448], 'DES': [56]}

d3 = {key:intersection(d1[key], d2[key]) for key in intersection(d1, d2)}

# write results to file

with open('results.txt','w') as w:
  lst = []
  for key in d3:
    for item in d3[key]:
      lst.append((key, item))
  print('\n'.join(map(str, lst)), file=w)

输出(在文件“results.txt”中):

('AES', 256)
('Blowfish', 224)
('Blowfish', 448)

推荐阅读