将嵌套的可迭代对象转换为列表

Posted

技术标签:

【中文标题】将嵌套的可迭代对象转换为列表【英文标题】:Convert nested iterables to list 【发布时间】:2016-08-12 02:07:46 【问题描述】:

在 python 中是否有一种简单的方法(使用 itertools 或其他方式)将嵌套的可迭代 f 转换为其相应的列表或元组?我想保存f,这样我就可以对其进行多次迭代,这意味着如果f 的某些嵌套元素是生成器,我就会遇到麻烦。

我将给出一个输入/输出示例。

>>> g = iter(range(2))
>>> my_input = [1, [2, 3], ((4), 5), [6, g]]
>>> magical_function(my_input)
[1, [2, 3], [[4], 5], [6, [0, 1]]]

如果输出也包含元组,那就没问题了。问题是迭代g“消耗”它,所以它不能再次使用。

【问题讨论】:

嵌套迭代的“对应列表”是什么意思?你想扁平化迭代吗?如果是这样,您想要一级展平、n 级展平还是递归展平? 我不想要任何扁平化。 “对应列表”的意思是我想保留f的嵌套结构。 你能否提供一些代码示例,你尝试了什么以及你想从中得到什么? 至少,请提供您希望转换的“之前”和“之后”的示例。 我认为这里不需要示例代码。这个问题很简单(虽然我不确定答案是否) 【参考方案1】:

这似乎最好通过检查每个元素是否可迭代来完成,如果它是可迭代的,则对其调用递归函数。就像一个快速的草拟,我会尝试这样的事情:

import collections

g = iter(range(2))
my_input = [1, [2, 3], ((4), 5), [6, g]]

def unfold(iterable):
    ret = []
    for element in iterable:
        if isinstance(element, collections.Iterable):
            ret.append(unfold(element))
        else:
            ret.append(element)
    return ret

n = unfold(my_input)
print(n)
print(n)

返回

$ python3 so.py
[1, [2, 3], [4, 5], [6, [0, 1]]]
[1, [2, 3], [4, 5], [6, [0, 1]]]

这不是最漂亮的方法,您可以找到改进它的方法(它将所有内容放在一个列表中,而不是保留元组),但这是我会使用的一般想法。

【讨论】:

太好了,这正是我想要的!我想知道在 itertools 中是否已经实现了类似的东西(我总是在我想要很久之后才发现这些东西),但如果没有,我总是可以使用这段代码。

以上是关于将嵌套的可迭代对象转换为列表的主要内容,如果未能解决你的问题,请参考以下文章

如何将嵌套列表映射到 Python 中的可迭代字典

搞懂python中的可迭代对象和迭代器对象(即迭代器)

在 Python 中结合两种不同的可迭代类型

迭代器

tuple()方法

具有可迭代对象的字典字典到具有多索引的可迭代对象索引的熊猫数据框