【问题标题】:How to recursively substitute a list of tuple pairs?如何递归替换元组对列表?
【发布时间】: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


【解决方案1】:

如果您使用的是字典,这样的事情应该可以工作:

original = {232: [230, 231], 148: [144, 145, 147, 232], 231: [214, 215]}

def expand(data, number, dest):
    if data.get(number):
        res = []

        for n in data.get(number):
            expand(data, n, res)

        dest.append([number, res])
    else:
        dest.append(number)

    return dest

print expand(original, 148, [])
[[148, [144, 145, 147, [232, [230, [231, [214, 215]]]]]]] 

【讨论】:

  • 注意,在数据本身隐含循环关系的情况下会导致最大递归错误,比如the example in my other comment
  • 这正是我所需要的。非常感谢!
猜你喜欢
  • 1970-01-01
  • 2015-12-03
  • 2014-03-05
  • 1970-01-01
  • 1970-01-01
  • 2018-02-20
  • 1970-01-01
  • 1970-01-01
  • 2010-11-07
相关资源
最近更新 更多