Tôi đang mắc kẹt trên một vấn đề nhỏ nhưng phức tạp kể từ hôm qua.Python - Lặp lại trên danh sách lồng nhau
gì tôi có là một (có thể là vô hạn) lồng danh sách như thế này:
[1,[2,[3,4]]]
or [[1,2],[3,4]] and so on.
Trên mỗi mức độ danh sách bao gồm hai danh sách phụ, (tôi không sử dụng các bộ vì danh sách có thể sẽ có được chiều dài tùy ý trong bước tiếp theo) Bây giờ tôi muốn chèn phần tử vào mọi vị trí có thể có trong danh sách này và trả về danh sách liệt kê tất cả các vị trí chèn có thể có. Vì vậy, nếu tôi chèn 5, sản lượng của tôi sẽ giống như thế:
[ [5,[1,[2,[3,4]]]],
[1,[5,[2,[3,4]]]],
[1,[2,[5,[3,4]]]],
[1,[2,[[3,5],4]]],
[1,[2,[3,[4,5]]]] ]
Nền: Tôi đang cố gắng để xây dựng một cây phả hệ bằng cách thêm một đơn vị phân loại tại một thời điểm. Mỗi taxon phải được chèn vào vị trí phù hợp nhất.
Những gì tôi có bây giờ là:
def get_trees(nwklist,newid):
if not isinstance(nwklist,list):
return [newid,nwklist]
else:
return [newid,nwklist],[get_trees(nwklist[0],newid),nwklist[1]],[nwklist[0],get_trees(nwklist[1],newid)]
mà không sản xuất đầu ra tôi muốn, nhưng đi kèm hơi gần.
([5, [1, [2, [3, 4]]]],
[[5, 1], [2, [3, 4]]],
[1, ([5, [2, [3, 4]]], [[5, 2], [3, 4]], [2, ([5, [3, 4]], [[5, 3], 4], [3, [5, 4]])])])
Có một giải pháp dễ dàng, có thể liên quan đến các hàm lambda, nhưng tôi không thấy nó.
Christoph
Bạn gần như chắc chắn đang phát minh lại bánh xe. Có các gói để xử lý cây phát sinh loài trong Python, giống như Phylo của Biopython (http://www.biopython.org/wiki/Phylo) hoặc dendropy (http://pypi.python.org/pypi/DendroPy) –
Chỉ cần nitpicking: danh sách có thể có * độ sâu tùy ý *, nhưng không phải * chiều sâu * vô hạn. Ít nhất, tôi không biết làm thế nào nó có thể. –
"Mỗi taxon phải được chèn vào vị trí phù hợp nhất." Điều này nghe như cố gắng xây dựng một cây hàng xóm tham gia, đó là một kế hoạch xấu. Tra cứu thêm một số tài liệu về cách tốt nhất để cấu thành cây phylogentic và tại sao cách dễ nhất cũng là điều tồi tệ nhất. – pyvi