Python 从预定义的数据结构连接序列
我一直在努力构建这段代码,我想知道是否还有其他更简单/高效的方法:Python 从预定义的数据结构连接序列,python,recursion,Python,Recursion,我一直在努力构建这段代码,我想知道是否还有其他更简单/高效的方法: fsSchema = {'published': {'renders': {'SIM': ('fold1', 'fold2'), 'REN': ('fold1', 'fold2')}}} def __buildPathFromSchema(self, schema, root=''): metaDirs = [] for dir_ in schema.keys(): root
fsSchema = {'published': {'renders': {'SIM': ('fold1', 'fold2'), 'REN': ('fold1', 'fold2')}}}
def __buildPathFromSchema(self, schema, root=''):
metaDirs = []
for dir_ in schema.keys():
root = os.path.join(root, dir_)
if isinstance(schema[dir_], dict):
return self.__buildPathFromSchema(schema[dir_], root)
if isinstance(schema[dir_], tuple):
for i in schema[dir_]:
bottom = os.path.join(root, i)
metaDirs.append(bottom)
root = os.sep.join(os.path.split(root)[:-1])
return metaDirs
基本上,我想做的是从预定义的结构(如fsSchema)生成路径。注意,最近的迭代总是一个元组
输出看起来像:
['published\renders\REN\fold1',
'published\renders\REN\fold2',
'已发布\renders\SIM\fold1',
'published\renders\SIM\fold2']
谢谢 您可以使用递归函数生成所有路径:
def flatten(data):
if isinstance(data, tuple):
for v in data:
yield v
else:
for k in data:
for v in flatten(data[k]):
yield k + '\\' + v
这应该能够处理任何类型的嵌套字典:
>>> fsSchema = {'published': {'renders': {'SIM': ('fold1', 'fold2'), 'REN': ('fold1', 'fold2')}}}
>>> list(flatten(fsSchema))
['published\\renders\\REN\\fold1', 'published\\renders\\REN\\fold2', 'published\\renders\\SIM\\fold1', 'published\\renders\\SIM\\fold2']
请注意,路径是以“随机”顺序生成的,因为字典没有任何内部顺序。而不是:
for dir_ in schema.keys():
...
if isinstance(schema[dir_], dict):
你可以做:
for dir_name, dir_content in schema.iteritems():
...
if isinstance(dir_content, tuple):
它速度更快,可读性更高。我会像你一样递归地做,但将助行器从路径生成器中分离出来:
def walk(data):
if hasattr(data, 'items'):
for outer_piece, subdata in data.items():
for inner_piece in walk(subdata):
yield (outer_piece, ) + inner_piece
else:
for piece in data:
yield (piece, )
def paths(data):
for path in walk(data):
yield os.sep.join(path)
原因是它实际上是两个独立的功能,将它们作为独立的功能来实现,因此更容易调试、维护、实现和一般考虑 哇,太快了。起初我确实试过发电机,但没能使它工作。非常感谢(:@Xavier:我碰巧在这里的文件中已经有了一些东西:)