我在列表列表中有一个树状结构。我想把它弄平。
[[[[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 )
任何简化欢迎......
答案 0 :(得分:1)
这假设壁球的输入总是一个包含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:]