Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/354.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 从预定义的数据结构连接序列_Python_Recursion - Fatal编程技术网

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:我碰巧在这里的文件中已经有了一些东西:)