【发布时间】:2011-10-14 05:12:30
【问题描述】:
从昨天开始,我就遇到了一个小而棘手的问题。
我拥有的是一个(可能是无限的)嵌套列表,如下所示:
[1,[2,[3,4]]]
or [[1,2],[3,4]] and so on.
在每个级别上,列表都包含两个子列表,(我没有使用元组,因为列表在下一步中可能会得到任意长度) 现在我想在这个列表的每个可能位置插入一个元素,并返回所有可能插入位置的列表列表。 所以如果我插入 5,我的输出应该是这样的:
[ [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]]]] ]
背景:我试图通过一次添加一个分类单元来构建系统发育树。每个分类单元都必须插入到最适合的位置。
我现在得到的是:
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)]
它不会产生我想要的输出,但有点接近。
([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]])])])
应该有一个简单的解决方案,可能涉及 lambda 函数,但我就是没看到。
克里斯托夫
【问题讨论】:
-
您几乎肯定是在重新发明轮子。在 Python 中有一些用于处理系统发育树的包,例如 Biopython 的 Phylo (biopython.org/wiki/Phylo) 或 dendropy (pypi.python.org/pypi/DendroPy)
-
只是吹毛求疵:您的列表可能有任意深度,但不是无限深度。至少,我不知道它是怎么做到的。
-
"每个分类单元都必须插入到最适合的位置。"这听起来像是试图构建一个邻接树,这是一个糟糕的计划。查找更多关于如何最好地构建系统发育树以及为什么最简单的方法也是最糟糕的文献。
标签: python list nested combinatorics bioinformatics