從所有List
中刪除出現在不同級別表達式中的所有空List[]
對象的最有效方法是什麼?只有當它是另一個List
本身的元素時,才應刪除空的List[]
。從列表中刪除空列表的有效方法?
回答
安德魯和阿列克謝指出,使用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
Replace
作品,和作品向上到頂部節點。在每個級別,檢查頭部就像向上看節點一樣簡單,看看它是否匹配List
。如果是這樣,則應用規則並向上移動一個級別,否則什麼都不做,並向上移動一級。這導致了最終的樹:
ReplaceRepeated
(//.)
,而另一方面,作品被與最上面的節點開始,向下遍歷樹前面的解決方案開始通過檢查第一個節點。一個List
如果它是,然後DeleteCases
被應用,它沿着樹移動,無情地替換它可以找到的每個{}
。請注意,它不檢查內部表達式的頭是否也匹配List
,因爲此遍歷由DeleteCases
,而不是ReplaceRepeated
。當//.
移動到隨後的較低節點,沒有什麼可替代的,它很快就會退出。這是一個與以前的解決方案得到樹:
注意裏面c[d, {}]
的{}
也被刪除。這完全是因爲DeleteCases
(水平規格{0,Infinity}
向下移動了樹實際上,如果第一個頭是List
以外的東西,它會跳過它並移動到下一層,其中只有{}
在{b, {}}
匹配。要與expr2 = f[a, {}, {b, {}}, c[d, {}]]
demostrate,我們得到
注意,在與Replace
當前的解決方案中,我們使用DeleteCases
與默認級別規範,這是唯一的第一級。它不因此,檢查並刪除比第一級更深的空列表,這正是如此我們需要在這裏。
儘管我們使用第一個節點來解釋失敗的原因,但推理對於每個節點都適用。列昂尼德更詳細地解釋了這些概念his book
- 1. 從列表中刪除具有空屬性的對象的最有效方法
- 2. Python - 從列表中刪除空列表
- 3. 從列表中刪除重複元素的最有效方法
- 4. 刪除列表中的空列表
- 5. 從列表中的多個列表中刪除空值
- 6. Python從列表中的列表中刪除空元素
- 7. 有效的方法從Python中刪除列表中的每個元素
- 8. 以遞歸方式刪除列表中的空格(列表中的列表...)python
- 9. 最有效的方法來刪除非數字列表條目
- 10. 從列表中刪除值從列表中刪除
- 11. 從列表中刪除空列表的每個實例
- 12. 從嵌套子列表中刪除對象的空列表
- 13. 從字典列表中刪除空格
- 14. 從值列表中刪除空
- 15. R:從列表中刪除空白
- 16. 從球拍列表中刪除空格
- 17. Groovy中刪除從列表空項
- 18. 從列表中獲取/刪除第一個元素的有效方法?
- 19. 通過鍵名從javascript對象中刪除值列表的最有效方法
- 20. 從一個列表中刪除相等值的最有效方法
- 21. WPF:從綁定列表中刪除最後一項的最有效方法?
- 22. 帶有效插入/刪除的「列表」
- 23. 從tcl列表中刪除子列表
- 24. C#從列表中刪除列表
- 25. 從列表中刪除子列表
- 26. Python:從列表中刪除列表?
- 27. 最有效的列表data.frame方法,當列表是行列表
- 28. 從列表內部列表中刪除空值
- 29. 如何使用scala從列表中刪除空列表?
- 30. FP語言:從列表中刪除空列表
這也將刪除除列表之外頭部的空列表,因此與規範相矛盾。 –
@Leonid:oops。沒有仔細閱讀這個問題......我想我的編輯應該修復它。 – abcd
您的新解決方案非常棒,效率非常高。比我的任何一個都快得多。 +1。 –