2011-07-03 103 views

回答

21

安德魯和阿列克謝指出,使用expr //. x_List :> DeleteCases[x, {}, Infinity]正如我在前面的回答還曾將在blah[{f[{}]}]刪除{},而應該把它作爲不變的頭是f,不是List。該解決方案,由於獅子座,是通過Infinity在距0各級正在取得替換不使用ReplaceRepeated,但Replace代替:

Replace[expr, x_List :> DeleteCases[x, {}], {0, Infinity}] 

之所以Replace作品和ReplaceRepeated不能夠從這個小例子看。通過與最裏面的表達式(多個)第一開始,即List[b,{}]c[d,{}]考慮expr = {a, {}, {b, {}}, c[d, {}]};在其TreeForm

enter image description here

Replace作品,和作品向上到頂部節點。在每個級別,檢查頭部就像向上看節點一樣簡單,看看它是否匹配List。如果是這樣,則應用規則並向上移動一個級別,否則什麼都不做,並向上移動一級。這導致了最終的樹:

enter image description here

ReplaceRepeated//.),而另一方面,作品被與最上面的節點開始,向下遍歷樹前面的解決方案開始通過檢查第一個節點。一個List如果它是,然後DeleteCases被應用,它沿着樹移動,無情地替換它可以找到的每個{}。請注意,它不檢查內部表達式的頭是否也匹配List,因爲此遍歷由DeleteCases ,而不是ReplaceRepeated。當//.移動到隨後的較低節點,沒有什麼可替代的,它很快就會退出。這是一個與以前的解決方案得到樹:

enter image description here

注意裏面c[d, {}]{}也被刪除。這完全是因爲DeleteCases(水平規格{0,Infinity}向下移動了樹實際上,如果第一個頭是List以外的東西,它會跳過它並移動到下一層,其中只有{}{b, {}}匹配。要與expr2 = f[a, {}, {b, {}}, c[d, {}]] demostrate,我們得到

enter image description here

注意,在與Replace當前的解決方案中,我們使用DeleteCases與默認級別規範,這是唯一的第一級。它不因此,檢查並刪除比第一級更深的空列表,這正是如此我們需要在這裏。

儘管我們使用第一個節點來解釋失敗的原因,但推理對於每個節點都適用。列昂尼德更詳細地解釋了這些概念his book

+0

這也將刪除除列表之外頭部的空列表,因此與規範相矛盾。 –

+0

@Leonid:oops。沒有仔細閱讀這個問題......我想我的編輯應該修復它。 – abcd

+3

您的新解決方案非常棒,效率非常高。比我的任何一個都快得多。 +1。 –