• python之判断字典中是否包含另一字典二


    前言:

      之前博客说过,一个字典是否包含在另一个字典中,可以将字典转化为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)}
    class assertDictIn:
        def __init__(self):
            ## 初始化set类型
            self.result = set()
    
        def _getKeys(self,data):
    
            ## 等于dict类型
            if type(data) == dict:
                ## 循环走起
                for key,value in data.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)
                    ## 同list
                    if 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或者tuple
            if type(data) in (list,tuple):
                ## 依旧循环走起
                for value in data:
                    ## 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 in data:
                    self.result.add(value)
    
            return self.result
    
        def checkIn(self,first:dict,second:dict):
    
            ## 非字典处理,直接raise
            if type(first) != dict or type(second) != dict:
                raise Exception("内部目前仅支持dict类型判断")
    
            ## 赋值第一个参数
            fir = self._getKeys(first)
            ## 重置一下结果
            self._clear()
            ## 赋值第一个参数
            sec = self._getKeys(second)
            ## 也重置一下吧
            self._clear()
    
            ## 断言
            if fir.issubset(sec):
                return True
            else:
                return False
    
        def _clear(self):
            self.result = set()
    asser = assertDictIn()
    print(asser.checkIn(a,b))
    print(asser.checkIn(a1,b))

    结果为:

    Ture

    False

      

  • 相关阅读:
    Oracle完全卸载
    Oracle数据库(64位) 及 PLSQL(64位)的组合安装【第一篇】
    Yii2 配置yii2redis扩展
    php 获取每个汉字的拼音首字母
    linux 安装memcacheq
    php在linux中执行外部命令
    比较两个日期的时间差精确到秒
    mysql 的 备份与还原
    php类中__get和__set的用法
    yii2.0 安装
  • 原文地址:https://www.cnblogs.com/dflblog/p/12049867.html
Copyright © 2020-2023  润新知