2014-02-12 23 views
0

我試圖找到一種方式來打平我的列表,以便它輸出從遞歸函數拼合列表:在Python

['one', 'two', 'three', 'four', 'five', 'six', 'seven', 'eight', 'nine'] 

到目前爲止,我的遞歸函數返回值與匹配的密鑰的新嵌套列表字典(使用舊的參數列表和字典)如下:

l = ['won', 'too', 'three', 'fore', 'five', 'six', 'seven', 'ate', 'nein'] 
d = dict(won='one', too='two', fore='four', ate='eight', nein='nine') 

def subst(l,d): 
    if len(l) == 1: 
     if l[0] in d: 
      return d[l[0]] 
     else: 
      return l[0] 
    else: 
     return [d[l[0]] if l[0] in d else l[0]] + [subst(l[1:],d)] 

到目前爲止,我已經得到:

['one', ['two', ['three', ['four', ['five', ['six', ['seven', ['eight', 'nine']]]]]]]] 

有什麼辦法可以在保持函數的遞歸完整性的同時將列表平坦化?

回答

1

您可以省略圍繞遞歸subst()調用的[]

或者,你可以做

def subst(l, d): 
    return [d.get(i, i) for i in l] 

剛剛在迭代列表,並與d,相應的條目,如果任何替代的每個項目,創建與結果的新名單。

如果你寧願保持列表中,你可以做

def subst(l, d): 
    for n, i in enumerate(l): 
     l[n] = d.get(i, i) 

在同時刪除了答案,someone asked關於[d[x] for x in l if x in d]的競爭條件。

競爭條件 - 對於線程化程序 - 由if x in dd[x]訪問之間的分隔組成。如果另一個線程完全刪除d引用的字典中的條目,則測試成功,但訪問仍然失敗。

+0

如果我在遞歸subst()'調用周圍省略'[]',我會得到一個TypeError:只能連接列表(而不是「str」)到列表。 – user2559679

+1

@ user2559679:因爲你的代碼並不總是返回一個列表...修復它 –

+0

@Karoly Horvath Eureka!謝謝!函數中的break/base大小寫返回一個字符串。只需用一些'[]'修復它。 – user2559679

1
map(lambda x: d[x] if x in d else x,l) 
+1

也許你可以添加一些描述到你的答案?只是張貼一段代碼而沒有解釋是很少有幫助的。 – Carpetsmoker