将嵌套的iterables转换为list

时间:2016-04-19 18:04:01

标签: python list generator iterable

在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“消耗”它,因此无法再次使用。

1 个答案:

答案 0 :(得分:2)

这似乎最好通过检查每个元素是否可迭代来做,并且如果它是可迭代的,则调用递归函数。就像快速起草一样,我会尝试类似的东西:

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]]]

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