嵌套列表和元组 - 内部构建

时间:2017-02-28 20:50:28

标签: python algorithm list python-3.x

问题

假设我有一个包含两个元素元组的列表,它包含更多嵌套元组,元组列表或字符串。

samp = [('coor', [('test', 'correlation'), 
        [('another', [('nest', 'one')]), ('tags', 'list')], ('threshold', 'foo')])]

>>> samp
[('coor',
  [('test', 'correlation'),
   [('another', [('nest', 'one')]), ('tags', 'list')],
   ('threshold', 'foo')])]

我还有一个类Foo,它只能正确接受不包含任何嵌套列表的列表,但可以包含其他Foo即可。

class Foo:
    def __init__(self, li):
        self.l = li
    def __repr__(self):
        return 'Foo<{0}>'.format(str(self.l))

我想将嵌套结构samp转换为一个巨大的有效Foo,所以在这种情况下它看起来像

>>> big_foo
Foo<[('coor', 
      Foo<[('test', 'correlation'), 
           Foo<[('another', 
                 Foo<[('nest', 'one')]>), 
                 ('tags', 'list')]>, 
           ('threshold', 'foo')]>
      )]>

我该如何有效地做到这一点?

我的想法

显然,我将不得不从最深的嵌套列表中构建内向外的Foo个对象。我知道我可以检查元素是元组还是带

的列表
def is_seq(el):
    return isinstance(el, collections.abc.Sequence) and not isinstance(el, str)

我可以检查任何可迭代的是否包含某个嵌套级别的列表,其中包含递归的内容,如

def contains_list(it):
    return any(isinstance(el, list) or (isinstance(el, tuple) and contains_list(el))
                for el in it)

我正在努力的是如何有效地构建我的新结构,因为元组是不可变的。从内到外递归构建结构似乎不可能,因为元组,所以我真的迷失了一个好的方法。如果有一些抽象或模块可以为我简化这个问题,我会很高兴接受它。

动机

我正在尝试使用pyRserve包装R库,并且需要在R中嵌套的命名成员列表的可序列化Python表示.pyRserve可以序列化的唯一类似事件是TaggedList在施工时支持筑巢,所以现在我遇到了这个问题。

1 个答案:

答案 0 :(得分:2)

如下:

Foo<[('coor', Foo<[('test', 'correlation'), Foo<[('another', Foo<[('nest', 'one')]>), ('tags', 'list')]>, ('threshold', 'foo')]>)]>

输出:

Foo<[('coor', 
    Foo<[('test', 'correlation'), 
        Foo<[('another', 
            Foo<[('nest', 'one')]>), 
            ('tags', 'list')]>, 
        ('threshold', 'foo')]>
    )]>

其中,如果你添加一些空格......

Random

非常类似于您想要的输出。