python字典(字典(字典(列表)))比较

时间:2014-07-16 12:46:30

标签: python list dictionary comparison

所以我想要一种方法来比较d1和d2

d1=
{"tables":
  {"k1":
    {"columns":
      ["val1","val2","val3"]
    },
    "forward":
    {"k2":
      ["val1","val2","val3"]
    }
  }
}

d2= 
{"tables":
  {"k1":
    {"columns":
      ["val2","val1","val3"]
    },
    "forward":
    {"k2":
      ["val2","val1","val3"]
    }
  }
}

并且相等。这两个列表字典来自不同的来源,我想要最简单的解决方案。我确信这是微不足道的,但我现在已经陷入困境。

EDIT1: 显然你理解我的问题。这正是我的意思。这些列表不相同,并且在有一个与列表对应的密钥集之前,我事先并不知道它们是列表或者有多少字典。这些来自json字符串,所以字典不区分列表和集合(我猜...)

1 个答案:

答案 0 :(得分:3)

如果您不关心字典结构中任何 list的顺序,您可以递归地将它们全部转换为无序的set数据结构:

def lists_to_sets(d):
    for k, v in d.items():
        if isinstance(v, list):
            d[k] = set(v)
        elif isinstance(v, dict):
            lists_to_sets(v)

这假设列表包含可清除对象 - 如果它们包含例如dict这不起作用。在行动:

>>> d1 = {"tables": {"k1": {"columns": ["val1", "val2", "val3"]},
                     "forward": {"k2": ["val1", "val2", "val3"]}}}
>>> d2 = {"tables": {"k1": {"columns": ["val2", "val1", "val3"]},
                     "forward": {"k2": ["val2", "val1", "val3"]}}}
>>> d1 == d2
False
>>> lists_to_sets(d1)
>>> lists_to_sets(d2)
>>> d1 == d2
True