【问题标题】:Flatten repeatable-tree展平可重复树
【发布时间】:2017-07-10 07:26:28
【问题描述】:

我在 List of Lists 中有一个树状结构。我想把它弄平。

 [[[[2, 1], [1, 2]], [[1, 2], [2, 1]]], [[[1, 2], [2, 1]], [[2, 1], [1, 2]]]]

这里是规则,在最低级别,两个两项列表以这样的方式组合在一起,即两者之间共享的中间数字 列表像这样被压扁/加入:

 [2, 1], [1, 2] => 212
 [1, 2], [2, 1] => 121

这将产生四到三个元素列表。在第二次操作中,两个列表之间的中间 2 个数字被压扁。

 212 121 , 121 212  => 2121 , 1212 => 21212

在下一步中,中间的 3 个数字被挤压/连接......以相同的方式等等。

顺便说一句,您不需要做任何检查,可以保证中间数字总是重复的,即匹配。

每个更高的级别都会在整个序列中增加一个新数字。 也可以使用任何数字,为了简单起见,这里我们只使用了 1 和 2。

任何想法。

如果您有 python 解决方案,但也欢迎其他语言。 但总的来说,我正在寻找这个想法。仍在测试它,但这似乎确实有效:

def squash(self, lst1, lst2):
    return lst1 + [lst2[-1]]

def unroll(self, lol):
    print lol
    if isinstance(lol[0], int) : return lol
    if isinstance(lol[0][0], int) : return self.squash(lol[0], lol[1])
    rv = [ self.unroll(lol[0]) , self.unroll(lol[1]) ]
    return self.unroll( rv )

欢迎任何简化...

【问题讨论】:

  • 大声笑?清单清单?不要使用自己的缩写。这不是推特,没有字数限制。另外,深度总是一样的吗?那么看来你不需要递归了。
  • 深度可能不同..

标签: python list tree flatten


【解决方案1】:

这假设 squash 的输入始终是一个包含 2 个元素的列表。

def isiter(x):
    try:
        iter(x)
        return True
    except TypeError:
        return False

def squash(x):
    if isiter(x[0][0]):
        return squash([squash(y) for y in x])
    else:
        return x[0] + x[1][-1:]

【讨论】:

  • 为什么你更喜欢 isiter() 而不是 isinstance() ?是不是更快?
  • isiter()是我倾向于使用的 toolz 库的一部分。您还可以提供元组或迭代器来压缩,而不仅仅是列表。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-03-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-12-26
  • 2013-08-31
  • 1970-01-01
相关资源
最近更新 更多