将嵌套的可迭代对象转换为列表
Convert nested iterables to list
python 中是否有一种简单的方法(使用 itertools 或其他方式)将嵌套的可迭代对象 f
转换为相应的列表或元组?我想保存 f
以便我可以多次迭代它,这意味着如果 f
的某些嵌套元素是生成器,我就会遇到麻烦。
我举个例子input/output。
>>> 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
"consumes" 它,所以它不能再次使用。
这似乎最好是检查每个元素是否可迭代,如果它是可迭代的,则对其调用递归函数。就像快速起草一样,我会尝试类似的方法:
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)
哪个returns
$ python3 so.py
[1, [2, 3], [4, 5], [6, [0, 1]]]
[1, [2, 3], [4, 5], [6, [0, 1]]]
这不是最漂亮的方法,您可以找到改进它的方法(它将所有内容放在列表中而不是保留元组),但这是我会使用的一般想法。
python 中是否有一种简单的方法(使用 itertools 或其他方式)将嵌套的可迭代对象 f
转换为相应的列表或元组?我想保存 f
以便我可以多次迭代它,这意味着如果 f
的某些嵌套元素是生成器,我就会遇到麻烦。
我举个例子input/output。
>>> 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
"consumes" 它,所以它不能再次使用。
这似乎最好是检查每个元素是否可迭代,如果它是可迭代的,则对其调用递归函数。就像快速起草一样,我会尝试类似的方法:
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)
哪个returns
$ python3 so.py
[1, [2, 3], [4, 5], [6, [0, 1]]]
[1, [2, 3], [4, 5], [6, [0, 1]]]
这不是最漂亮的方法,您可以找到改进它的方法(它将所有内容放在列表中而不是保留元组),但这是我会使用的一般想法。