我正在阅读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'}
我要求另一种方法来解决问题。 此外,复杂但先进的解决方案也受到高度赞赏。