首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >展平可重复树

展平可重复树
EN

Stack Overflow用户
提问于 2017-02-21 05:16:02
回答 1查看 80关注 0票数 3

我在列表列表中有一个树状结构。我想把它弄平。

代码语言:javascript
复制
 [[[[2, 1], [1, 2]], [[1, 2], [2, 1]]], [[[1, 2], [2, 1]], [[2, 1], [1, 2]]]]

以下是规则,在最低级别上,两个包含两个项目的列表以这样的方式组合在一起,即两个列表之间共享的中间数字像这样被挤压/连接:

代码语言:javascript
复制
 [2, 1], [1, 2] => 212
 [1, 2], [2, 1] => 121

这将产生4-3个元素列表。在第二个操作中,两个列表之间的中间2个数字被压缩。

代码语言:javascript
复制
 212 121 , 121 212  => 2121 , 1212 => 21212

在下一步中,中间的3个数字将被压缩/连接...以此类推。

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

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

任何想法。

如果你有python的解决方案,但也欢迎其他语言。但总的来说,我是在寻找这个想法。仍在测试中,但这似乎确实起到了作用:

代码语言:javascript
复制
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 )

任何简化欢迎..。

EN

回答 1

Stack Overflow用户

发布于 2017-02-21 07:56:09

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

代码语言:javascript
复制
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:]
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42354349

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档