有没有办法避免这么多列表(链(*list_of_list))?

Posted

技术标签:

【中文标题】有没有办法避免这么多列表(链(*list_of_list))?【英文标题】:Is there a way of avoiding so many list(chain(*list_of_list))? 【发布时间】:2015-06-16 21:55:18 【问题描述】:

如果我有两个字符串的元组列表列表。我想将它展平为一个非嵌套的元组列表,我可以这样做:

>>> from itertools import chain
>>> lst_of_lst_of_lst_of_tuples = [ [[('ab', 'cd'), ('ef', 'gh')], [('ij', 'kl'), ('mn', 'op')]], [[('qr', 'st'), ('uv', 'w')], [('x', 'y'), ('z', 'foobar')]] ]
>>> lllt = lst_of_lst_of_lst_of_tuples
>>> list(chain(*list(chain(*lllt))))
[('ab', 'cd'), ('ef', 'gh'), ('ij', 'kl'), ('mn', 'op'), ('qr', 'st'), ('uv', 'w'), ('x', 'y'), ('z', 'foobar')]

但是,如果没有嵌套的list(chain(*lst_of_lst)),是否有另一种解包到非嵌套元组列表的方法?

【问题讨论】:

【参考方案1】:

在解压迭代器之前不需要调用list

list(chain(*chain(*lllt)))

最好使用chain.from_iterable 而不是解包,使用迭代器而不是使用* 将它们具体化为元组:

flatten = chain.from_iterable
list(flatten(flatten(lllt)))

【讨论】:

【参考方案2】:

你可以继续解包,直到你找到元组:

def unpack_until(data, type_):
    for entry in data:
        if isinstance(entry, type_):
            yield entry
        else:
            yield from unpack_until(entry, type_)

然后:

>>> list(unpack_until(lllt, tuple))
[('ab', 'cd'),
 ('ef', 'gh'),
 ('ij', 'kl'),
 ('mn', 'op'),
 ('qr', 'st'),
 ('uv', 'w'),
 ('x', 'y'),
 ('z', 'foobar')]

【讨论】:

以上是关于有没有办法避免这么多列表(链(*list_of_list))?的主要内容,如果未能解决你的问题,请参考以下文章

在 Yocto 树中使用预构建的工具链

数据库中的数百万行,只需要这么多

没有办法就是这么强大,前端框架介绍VUE

在 Django 管理员中,有没有办法显示模型的一对多对象的实际链接列表?

为什么区块链宠物得到这么多资本家的青睐?

浏览器返回作用于页面本身之前的嵌套 iframe - 有没有办法避免它?