Python读取两个字典比较值并创建第三个字典

时间:2016-11-07 15:15:42

标签: python dictionary compare

我有两个要比较的字典文件。我需要知道一个字典中的值是否出现在另一个字典中。键是不一样的,所以我不能基于键。

目标:

  1. 两个词典中都存在相同的值吗?
  2. 打印其他字典中未出现的值。
  3. 使用Keys创建一个新词典,从匹配的词典和打印词典到屏幕的值。
  4. 我可以搜索两个字典并找到69个不同的条目。

    我的问题是:

    1. 我怀疑有一种更简单的方法可以做到这一点
    2. 我怀疑整体方法更好。
    3. 我不会在匹配时用两个值/键创建第三个字典。
    4. 当前代码:

      #!/usr/bin/python
      
      # Open Files and Build dictionaries.
      
      ackg2shipping = open('AirCheckG2_ShippingLog.txt', 'r', encoding='ascii')
      dAckg2 = {}
      for line in ackg2shipping:
          if not line.strip():
              continue
          row = line.split(',')
          # creating unique key as one does not exist in file:
          mfgDate = row[2]
          serialNumber = row[5]
          dAckg2[mfgDate] = serialNumber
      
      macAddressLog = open('MacAddress.dat', 'r', encoding='ascii')
      dMacaddress = {}
      for line in macAddressLog:
          if not line.strip():
              continue
          row = line.replace(", ", ",").split(',')
          macAddress = row[0]
          serialNum2 = row[1]
          if serialNum2.find("_2") != -1:
              continue
          if serialNum2.find("HM") != -1:
              continue
          if serialNum2.find("-") != -1:
              continue
          if serialNum2.find("Min") != -1:
              continue
          if serialNum2.find("Max") != -1:
              continue
          dMacaddress[macAddress] = serialNum2
      
      for ackValue, macValue in zip(dAckg2.items(), dMacaddress.items()):
              if ackValue == macValue:
                  print('Ok', ackValue, macValue)
              else:
                  print('Not', ackValue, macValue)
      
      
      match = 0
      nomatch = 0
      
      for ackKey, ackValue in dAckg2.items():
          for macKey, macValue in dMacaddress.items():
              if ackValue == macValue:
                  # print("Debug: ", macValue, ackValue, "Match")
                  match += 1
              else:
                  # print("no match")
                  # print("Debug: ", macValue, ackValue)
                  nomatch += 1
      
      print("Matched: ", match)
      print("Not Matched:", nomatch)
      
      match = 0
      nomatch = 0
      for macKey, macValue in dMacaddress.items():
          for ackKey, ackValue in dAckg2.items():
              if macValue == ackValue:
                  # print("Debug: ", macValue, ackValue, "Match")
                  match += 1
              else:
                  # print("no match")
                  # print("Debug: ", macValue, ackValue)
                  nomatch += 1
      
      print("Matched: ", match)
      print("Not Matched:", nomatch)
      missingSerials = (len(dAckg2) - match)
      # noinspection PyPep8
      print(missingSerials)
      

1 个答案:

答案 0 :(得分:1)

如果您只关心这些值,那么dict.values()方法可能就是您想要的。

d1_values = set(d1.values())
d2_values = set(d2.values())
in_both = d1_values & d2_values
not_in_both = d1_values ^ d2_values

我不确定你的第三个要求究竟是什么。是这样的吗?

new_dict = {}
for k, v in d1.items():
    if v in in_both:
       new_dict.update((k, v))
for k, v in d2.items():
    if v in in_both:
        new_dict.update((k, v))
print(new_dict)