2016-08-19 39 views
-1

列表可以更深或更淺,但說我有深度2的列表如下:追加的任意嵌套列表的元素在深度優先搜索式的方式,無需遞歸

a = [['a','b'],['c','d'],['e','f']] 

我想編寫一個函數,f(a),這樣它會返回以下新的列表:

['acef', 'adef', 'bcef', 'bdef'] 

從本質上講,我模仿深度優先搜索,其中列表是節點。我希望函數能夠在depth = n的情況下工作,其中n是任意整數。什麼是達到這個最pythonic方式?

我的遞歸代碼如下:

def f(elems): 
    curr, *rest = elems 

    if not rest: 
     return ''.join(curr) 

    ret = [''.join(x + f(rest)) for x in curr] 
    return ret 

我怎麼會去反覆地解決這個?

+2

你的輸出不是一個有效的Python數據結構。另外,它爲什麼看起來像'['e','f']'列表正在得到特殊待遇?你用「深度」來指代長度嗎? – user2357112

+0

看起來像除了最後一個元素之外的所有組合,然後連接最後一個元素。不知道你算法是否完全清楚。 (但如果是這樣,你可能會有解決方案) – Anthon

+0

@ user2357112哦,我明白你的意思了。它是一個修改過的DFS,因此最後一個元素總是將所有元素連接起來。是depth = length – ifma

回答

1

您可以使用itertools.product

import itertools 

def f(elems): 
    *branches, leaves = elems 
    for path in itertools.product(*branches): 
     yield ''.join(itertools.chain(path, leaves)) 

a = [['a','b'],['c','d'],['e','f']] 
print(list(f(a))) 

這給:

['acef', 'adef', 'bcef', 'bdef']