【问题标题】:Python: Comparing dictionaries for multiple scenariosPython:比较多个场景的字典
【发布时间】:2018-02-15 13:55:51
【问题描述】:

我正在比较包含多达 100,000 个结果的服务器文件的字典。

我从我的服务器中捕获了一个列表文件,并将它们读入我程序的字典中。键值为 md5 哈希,v 值为路径(即 /usr/john/upstart.exe)。

我的字典被命名为firstServsecondServ

我需要找出在哪里:

  • 对 firstServ 或 secondServ 完全唯一的键和值。
  • firstServ 中的 K 与 secondServ 中的 k 不同,但关联的值相同
  • 最后,键相同但值不同。(假设这不应该发生,但它会验证数据的清洁程度。)

基本上,我只需要知道如何进行这些比较。感谢您的任何意见。

【问题讨论】:

  • 能否提供示例代码和示例数据进行编辑?

标签: python sorting dictionary compare


【解决方案1】:

一个很简单的思路如下;

FirstSet = {"1":"C:/", "2":"C:/Windows", "3":"C:/Users","4":"C:/Something"}
SecondSet = {"10":"E:/", "20":"C:/", "30":"C:/Users"}

Differences = []

for i in FirstSet.keys():
    if(FirstSet[i] not in SecondSet.values()):
        Differences.append((FirstSet[i],"FirstSet"))


for i in SecondSet.keys():
    if(SecondSet[i] not in FirstSet.values()):
        Differences.append((SecondSet[i],"SecondSet"))


for i in Differences:
    print("Only set {} has the {} element.".format(i[1],i[0]))

【讨论】:

    【解决方案2】:

    有 101 种方法可以做到这一点。

    也许将你的键值对加载到这样的东西中:

    x = { k: [v1,v2] }
    

    然后你将把来自 firstServ 和 secondServ 的数据按哈希分组在一起。只需遍历字典,找出不同之处。

    【讨论】:

      【解决方案3】:

      使用列表推导和简单的 for 循环,您可以做到这一点:

      鉴于这些词典:

      firstServ = {"md5Hash1":"path1", "md5Hash2":"path2", "md5Hash3":"path3"}
      secondServ = {"md5Hash1":"path4", "md5Hash4":"path2", "md5Hash5":"path5"}
      

      提取密钥:

      firstServKeys = set(firstServ.keys())
      secondServKeys = set(secondServ.keys())
      

      firstServ 独有的键

      从 firstServKeys 中减去 secondServKeys

      uniqueKeysInFirstServ = firstServKeys.difference(secondServKeys)
      

      secondServ 独有的键

      从 secondServKeys 中减去 firstServKeys

      uniqueKeysInSecondServ = secondServKeys.difference(firstServKeys)
      

      两个字典中存在不同键的值

      将两个映射从 {hash:path} 反转为 {path:hash},然后对于 inv_festServ 中的所有路径,查找 inv_festServ 是否也有,如果它们的哈希不同则保留。

      inv_festServ = {v: k for k, v in firstServ.items()}  # Inverting keys and values
      inv_secondServ = {v: k for k, v in secondServ.items()}  # Inverting keys and values
      valuesWithDifferentkeys = [v for v in list(inv_festServ.keys()) 
          if v in inv_secondServ.keys() and inv_secondServ[v] != inv_festServ[v]]
      

      两个字典中存在不同值的键

      将 firstServKeys 和 secondServKeys 相交以获得所有公共密钥,这样我们就可以处理较小的集合 然后对于每个键,如果值不同,则保留

      keysWithDifferentValues = [k for k in firstServKeys.intersection(secondServKeys) 
          if firstServ[k] != secondServ[k]]
      

      打印出来:

      print("Keys unique to first server:")
      print(uniqueKeysInFirstServ)
      print("Keys unique to second server:")
      print(uniqueKeysInSecondServ)
      print("Values present in both servers but with a different key:")
      print(valuesWithDifferentkeys)
      print("Keys present in both servers but with a different value:")
      print(keysWithDifferentValues)
      

      输出

      Keys unique to first server:
      {'md5Hash2', 'md5Hash3'}
      
      Keys unique to second server:
      {'md5Hash5', 'md5Hash4'}
      
      Values present in both servers but with a different key:
      ['path2']
      
      Keys present in both servers but with a different value:
      ['md5Hash1']
      

      【讨论】:

      • 非常感谢,效果非常好,并帮助我完成了部分代码:)
      猜你喜欢
      • 2010-09-23
      • 2012-04-07
      • 2019-06-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-02-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多