检查列表中的元素是否包含在嵌套字典

时间:2017-11-22 11:27:23

标签: python

我正在阅读4. Built-in Types — Python 3.6.3 documentation

我总结了一个dict和一个builtin_types列表如下:

builtin_types_list = ['bytearray', 'bytes', 'classmethod', 'complex', 'dict',
'enumerate', 'filter', 'float', 'frozenset', 'int', 'bool', 'list', 'map',
'memoryview', 'property', 'range', 'reversed', 'set', 'slice',
'staticmethod', 'str', 'super', 'tuple', 'type', 'zip']

structured_builtin_types = {
'primitive': { 'text sequence':{'str'},
             'binary sequeces':{'bytes', 'bytearray', 'memoryview'},
                    'numerics':{'int', 'float', 'complex'},
                   'constants':{'bool':{'True', 'False'}},
                        '        null':{'None'}},
'container': {'sequence':{'sequences':{'tuple', 'list','zip', 'range', 'enumerate', 'reversed'},
                          'iterator' :{'generator', 'map', 'filter'}},
            'collection':{'mapping'  :{'dict'},
                          'sets'     :{'set', 'frozenset'}}},
   'method': {'instance':{'property', 'staticmethod', 'classmethod'},
                 'class':{'super'}}
}

我打算检查builtin_types_list中的所有元素是否正确定位到structured_builtin_types而没有留下任何项目。

我的解决方案首先将它们转换为集合,然后检查issubset是否为True。

由于structured_builtin_types中有嵌套的词组 我编写了一个递归函数来从structured_builtin_types

中提取集合
  

逻辑的伪代码:

     

声明myset = set()
  循环键和structured_builtin_types的项目视图中的值,
  检查值的类型是否为集合,更新myset,
  检查值的类型是否为dict,递归调用函数。

我的代码:

myset =set()
def get_sets(mydict):
    for k, v in mydict.items():
        if isinstance(v, set):
            myset.update(v)
        if isinstance(v, dict):
            get_sets(v)

运行并输出:

In [91]: get_sets(structured_builtin_types)
In [93]: print(myset)
{'True', 'dict', 'False', 'frozenset', 'staticmethod', 'generator', 'zip', 'str', 'enumerate', 'None', 'reversed', 'tuple', 'bytes', 'set', 'map', 'complex', 'float', 'classmethod', 'property', 'int', 'bytearray', 'filter', 'memoryview', 'list', 'super', 'range'}
# check if issubset
In [94]: set( builtin_types_list).issubset(myset)
Out[94]: False
#get the difference
In [95]: set(builtin_types_list) - myset
Out[95]: {'bool', 'slice', 'type'}

我要求另一种方法来解决问题。 此外,复杂但先进的解决方案也受到高度赞赏。

0 个答案:

没有答案