Estoy atascado en un problema pequeño pero difícil desde ayer.Python - Iteración sobre listas anidadas
Lo que tengo es una (posiblemente infinito) Lista anidado como este:
[1,[2,[3,4]]]
or [[1,2],[3,4]] and so on.
En cada nivel las listas consisten en dos sublistas, (no hice uso de tuplas porque las listas probable que obtener una longitud arbitraria en el próximo paso) Ahora quiero insertar un elemento en cada posición posible en esta lista y devolver una lista de todas las posibles posiciones de inserción. Así que si inserto 5, mi salida debería verse como:
[ [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]]]] ]
El fondo: Estoy tratando de construir un árbol filogenético mediante la adición de un taxón a la vez. Cada taxón debe insertarse en la posición en la que se ajuste mejor.
Lo que tengo ahora es:
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)]
que no produce la salida que quiero, pero llega un poco cerca.
([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]])])])
Debería haber una solución fácil, quizás con funciones lambda, pero simplemente no la veo.
Christoph
Seguramente está reinventando la rueda. Hay paquetes para el manejo de árboles filogenéticos en Python, como Phylo de Biopython (http://www.biopython.org/wiki/Phylo) o dendropy (http://pypi.python.org/pypi/DendroPy) –
Sólo detalle: su la lista puede tener * profundidad arbitraria *, pero no profundidad * infinita *. Al menos, no sé cómo podría. –
"Cada taxón debe insertarse en el lugar donde se ajuste mejor". Esto suena como intentar construir un árbol de unión de vecinos, que es un mal plan. Busque literatura adicional sobre la mejor forma de construir árboles filogenéticos y por qué la forma más fácil también es la peor. – pyvi