2010-10-01 69 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