Cách hiệu quả nhất để loại bỏ tất cả các đối tượng rỗng là List[]
từ tất cả các số List
s xuất hiện trong một biểu thức ở các mức khác nhau? Chỉ cần xóa List[]
trống nếu nó là một phần tử của chính nó List
.Cách hiệu quả để xóa danh sách trống khỏi danh sách?
Trả lời
Andrew và Alexey chỉ ra rằng việc sử dụng expr //. x_List :> DeleteCases[x, {}, Infinity]
như tôi đã có trong câu trả lời trước của tôi cũng sẽ loại bỏ các {}
trong blah[{f[{}]}]
, trong khi nó nên để nó ảnh hưởng làm Trưởng ban là f
, không phải là một List
. Các giải pháp, nhờ Leonid, là để không sử dụng ReplaceRepeated
, nhưng Replace
thay vì với thay thế được thực hiện ở tất cả các cấp độ từ 0
qua Infinity
:
Replace[expr, x_List :> DeleteCases[x, {}], {0, Infinity}]
Lý do tại sao Replace
công trình và ReplaceRepeated
không thể nhìn từ ví dụ nhỏ này. Cân nhắc expr = {a, {}, {b, {}}, c[d, {}]};
trong TreeForm
Replace
tác phẩm của mình bằng cách bắt đầu với biểu hiện trong cùng (s) đầu tiên, tức là, List[b,{}]
và c[d,{}]
, và các công trình lên đến nút đầu. Ở mỗi cấp, kiểm tra đầu đơn giản như nhìn lên nút bên phải phía trên và xem nó có khớp với List
hay không. Nếu có, áp dụng các quy tắc và di chuyển lên một cấp độ, người khác không làm gì và di chuyển lên một cấp độ. Điều này dẫn đến một cái cây cuối cùng:
ReplaceRepeated
(//.)
, mặt khác, hoạt động bằng cách bắt đầu với nút đầu nhất và vượt qua xuống cây Các giải pháp trước đây bắt đầu bằng cách kiểm tra nếu nút đầu tiên là. a List
và nếu có, thì DeleteCases
được áp dụng và nó di chuyển xuống cây, thay thế tàn nhẫn mọi {}
nó có thể tìm thấy. Lưu ý rằng nó không kiểm tra xem đầu của biểu thức bên trong có khớp với List
hay không, bởi vì quá trình truyền tải này được thực hiện bởi DeleteCases
, không phải ReplaceRepeated
. Khi //.
di chuyển xuống thấp hơn tiếp theo nút, không có gì hơn để thay thế và nó thoát ra nhanh chóng. Đây là cây mà người ta được với giải pháp trước:
Lưu ý rằng {}
bên c[d, {}]
cũng đã được gỡ bỏ. Điều này chỉ là do thực tế là DeleteCases
(với đặc điểm kỹ thuật cấp {0,Infinity}
di chuyển xuống cây. Thật vậy, nếu đầu đầu tiên là một cái gì đó khác hơn List
, nó sẽ bỏ qua nó và chuyển sang cấp độ tiếp theo, trong đó chỉ {}
trong {b, {}}
là một trận đấu. Để demostrate với expr2 = f[a, {}, {b, {}}, c[d, {}]]
, chúng tôi nhận
Lưu ý rằng trong các giải pháp hiện tại với Replace
, chúng tôi sử dụng DeleteCases
với đặc tả mức mặc định, mà chỉ là cấp độ đầu tiên. Nó không , do đó, hãy kiểm tra và xóa các danh sách trống sâu hơn ở cấp độ đầu tiên, đó chính xác là những gì chúng ta cần ở đây.
Mặc dù chúng tôi đã sử dụng nút đầu tiên để giải thích lý do tại sao nó không thành công, lý do giữ đúng cho mọi nút. Leonid giải thích các khái niệm này chi tiết hơn trong his book
- 1. Python: Cách xóa danh sách trống khỏi danh sách?
- 2. C# Xóa danh sách khỏi danh sách
- 3. xóa danh sách phụ khỏi danh sách trong tcl
- 4. Xóa mục khỏi danh sách
- 5. Xóa danh sách khỏi danh sách bằng Python
- 6. Xóa danh sách các đối tượng khỏi danh sách khác
- 7. Cách xóa khỏi Danh sách <T> hiệu quả (C#)?
- 8. cách xóa chuỗi rỗng khỏi danh sách, sau đó xóa giá trị trùng lặp khỏi danh sách
- 9. Python - xóa các mục khỏi danh sách
- 10. Xóa YourSelf khỏi danh sách ShareActionProvider
- 11. C# xóa các mục khỏi danh sách
- 12. Xóa mục khỏi danh sách bằng linq
- 13. Xóa mục danh sách khỏi DropDownList
- 14. xóa mục khỏi danh sách weak_ptrs
- 15. Cách tốt nhất để xóa đối tượng khỏi Danh sách
- 16. Trong Python, làm cách nào để xóa mục danh sách thứ N từ danh sách danh sách (xóa cột)?
- 17. Xóa phần tử khỏi danh sách chung
- 18. Python: Cách xóa danh sách trùng lặp trong danh sách danh sách?
- 19. Làm cách nào để xóa khung dữ liệu trống khỏi danh sách?
- 20. Cách xóa danh sách các từ khỏi danh sách các chuỗi
- 21. Danh sách WPF trống datatemplate
- 22. Xóa danh sách tham số khỏi f (danh sách) bằng bộ tiền xử lý
- 23. Xóa các bản sao khỏi danh sách các danh sách trong Python
- 24. Cách xóa một mục khỏi danh sách chung
- 25. Python: Xóa dấu cách khỏi đối tượng danh sách
- 26. Cách xóa phần tử khỏi danh sách JQUERY mobile
- 27. Cách xóa danh sách khỏi tóm tắt xác thực
- 28. Sự cố khi xóa các phần tử khỏi danh sách khi lặp qua danh sách
- 29. Cách cập nhật danh sách các thực thể hiệu quả
- 30. Xóa tất cả các giá trị trong một danh sách khỏi một danh sách khác?
Điều này cũng sẽ xóa các danh sách trống bên trong các đầu khác ngoài danh sách và do đó mâu thuẫn với các thông số. –
@Leonid: oops. Không đọc kỹ câu hỏi ... Tôi nghĩ bản chỉnh sửa của tôi nên sửa nó. – abcd
Giải pháp mới của bạn rất tuyệt vời, rất hiệu quả. Nhanh hơn nhiều so với tôi. +1. –