【发布时间】:2015-06-27 21:36:50
【问题描述】:
我在编写一个函数时遇到了一些麻烦:
[(232, [230, 231]), (148, [144, 145, 147, 232]), (231, [214, 215])]
到
[[148, [144, 145, 147, [232, [230, [231, [214, 215]]]]]]]
每个元组中的第一个元素是相应列表元素中元素的父元素。 148 是根(值存储在其他地方的变量中),从根开始,我需要用相应的列表替换 232,然后在刚刚替换 232 的列表中替换 231。
它需要是一个通用的递归解决方案,因为我可能会遇到更复杂的情况,例如:
[(227, [187, 188, 190, 192, 242]), (240, [238, 239, 305]), (305, [307, 308, 309]), (242, [256, 257, 258]), (247, [227, 245, 246]), (248, [247]), (188, [189, 191]), (190, [233, 234, 240])]
其中 248 是根。
或者,如果有更好的方法来构造数据,换句话说,如果我正在做的事情很愚蠢,我愿意接受建议。
【问题讨论】:
-
或许退后一步比较好。这个数据代表什么?你从哪里得到原始列表,它是什么格式的?乍一看,字典似乎是您那里的数据更好的格式,但很难用您提供的信息来判断。
-
如果元素是唯一的(似乎它们必须通过它们递归),字典是更好的数据结构。
-
如果数据隐含的结构本身是递归的呢?例如
[(232, [230, 231]), (231, [214, 215]), (215, [232])]——如果没有大量额外的假设,您似乎无法获得通用解决方案(请记住,数据递归循环开始的距离可能任意远,您无法检查该属性而无需访问所有数据)。即使只是计算根也很棘手。看起来数据应该根据一些使计算变得容易的关系存储在数据库中(如果确实需要这种计算)。 -
@Mr.F 公平点。你是对的,我没有明确说明可以做出哪些假设。但至少就我而言,我可以假设没有循环关系。
-
我正在努力保持代码简洁易读。我以后可以去诺克斯堡。我尝试遵守其中的大多数,这里适用的一个是投机普遍性。 blog.codinghorror.com/code-smellsxp.c2.com/YouArentGonnaNeedIt.html
标签: python list recursion merge