前言:
之前博客说过,一个字典是否包含在另一个字典中,可以将字典转化为set,然后使用他其中的issubset来判断是否存在包含关系。详细可参考:https://www.cnblogs.com/dflblog/p/11944980.html
也就是已知一个dict,比如为a = {"a":1},另一个dict比如为b = {"a":1,"b":2},想要一个结果判断a是否在与b中,将a转化为set,b转化为set,然后用a的issubset来确认是否返回Ture。
背景:
这里会存在一个问题,因为set是一个无序且不重复的元素集合。元素为不可变对象!!!
是什么意思,也就是如上例,b的数据类型为这个样子的话:
b = {"a":{"aa":11},"b":[1,2,3],"c":(1,2,3)}
那么就直接异常了。
代码先跑起来:
d = {"a":{"aa":11},"b":[1,2,3],"c":(1,2,3)}
dd= set(d.items())
结果直接抛出异常TypeError: unhashable type: 'dict'。
告诉我们类型错了,dict是一个可变对象,说到这里又开始上篇的问题了。如果都是不可变对象,上篇是可以使用的
但如果存在可变对象,没办法转化成set类型, 这个怎么处理???
没办法,只能自己一个一个处理了。给打开放一个刚设计的一个例子。
仔细看的人会发现还有问题存在~~嘻嘻嘻。
a = {"a":{"aa":11}}
a1= {"d":"d"}
b= {"a":{"aa":11},"b":[1,2,3],"c":(1,2,3)}classassertDictIn:
def __init__(self):
## 初始化set类型
self.result= set()
def _getKeys(self,data):
## 等于dict类型if type(data) ==dict:
## 循环走起for key,value indata.items():
## 若循环的value值为list类型,继续调用
## 各个为空处理if type(value) ==list:if value ==[]:
self.result.add(key)
self.result.add(value)else:
self._getKeys(value)if type(value) ==dict:
## 如果dict为空处理if value =={}:
self.result.add(key)
self.result.add(value)else:
self._getKeys(value)
## 同listif type(value) ==tuple:if value ==():
self.result.add(key)
self.result.add(value)else:
self._getKeys(value)
self._getKeys(value)
## 如果循环的value类型为基本类型,直接添加if type(value) in (str,int,float,set):
self.result.add(key)
self.result.add(value)
## 若传入类型为list或者tupleif type(data) in(list,tuple):
## 依旧循环走起for value indata:
## list时继续调用if type(value) ==list:
self._getKeys(value)
## dict时也继续调用if type(value) ==dict:
self._getKeys(value)
## tuple时继续调用if type(value) ==tuple:
self._getKeys(value)
## 若为这些类型,直接添加if type(value) in (str, int, float, set):
self.result.add(value)
## 若传入为set类型,直接添加if type(data) is set:for value indata:
self.result.add(value)returnself.result
def checkIn(self,first:dict,second:dict):
## 非字典处理,直接raiseif type(first) != dict or type(second) !=dict:
raise Exception("内部目前仅支持dict类型判断")
## 赋值第一个参数
fir=self._getKeys(first)
## 重置一下结果
self._clear()
## 赋值第一个参数
sec=self._getKeys(second)
## 也重置一下吧
self._clear()
## 断言iffir.issubset(sec):returnTrueelse:returnFalse
def _clear(self):
self.result= set()
asser=assertDictIn()
print(asser.checkIn(a,b))
print(asser.checkIn(a1,b))
结果为:
Ture
False