假设我有一个包含两个元素元组的列表,它包含更多嵌套元组,元组列表或字符串。
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在施工时支持筑巢,所以现在我遇到了这个问题。
答案 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
非常类似于您想要的输出。