2010-10-01 30 views
0

我一直在努力一点点打造这段代码,如果有其他人这样做的更加简单/高效的方式我想知道:连结之重复序列

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这样的预定义结构生成路径。注意最新的迭代总是一个元组。

的输出中的样子:

[ '发表\渲染\ REN \ fold1', '出版\渲染\ REN \ fold2', '出版\渲染\ SIM \ fold1', “发表\渲染\ SIM \ fold2']

谢谢!

回答

3

您可以使用递归函数生成的所有路径:

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'] 

注意,路径中产生的“随机“命令,因为字典没有任何内部命令。

+0

哇,那很快。我确实尝试过使用发生器,但无法使其工作。非常感谢(: – Xavier 2010-10-01 21:12:28

+0

@ Xavier:我碰巧在这里有一个文件中有东西:) – sth 2010-10-01 21:16:17

1

相反的:

for dir_ in schema.keys(): 
    ... 
    if isinstance(schema[dir_], dict): 

你可以这样做:

for dir_name, dir_content in schema.iteritems(): 
    ... 
    if isinstance(dir_content, tuple): 

它的速度更快,更具可读性。

1

我会继续递归地做它就像你已经是但是从路径生成关分割步行者:

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) 

原因是,它实际上是两个独立的功能块,并让他们实现不同的功能因此更易于调试,维护,实施和普遍思考。

+0

事实上它更具可读性(+1),谢谢 – Xavier 2010-10-01 21:14:47