Jon Warneke
Jon Warneke

Reputation: 337

Convert nested iterables to list

Is there an easy way in python (using itertools, or otherwise) to convert a nested iterable f into its corresponding list or tuple? I'd like to save f so I can iterate over it multiple times, which means that if some nested elements of f are generators, I'll be in trouble.

I'll give an example 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]]]

It would be fine if the output consisted of tuples, too. The issue is that iterating over g "consumes" it, so it can't be used again.

Upvotes: 1

Views: 388

Answers (1)

Kevin W.
Kevin W.

Reputation: 1183

This seems like it would be best to do by checking if each element is iterable, and calling a recursive function over it if it is iterable. Just as a quick draw-up, I would try something like:

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)

which returns

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

It's not the prettiest way, and you can find ways to improve it (it puts everything in a list instead of preserving tuples), but here is the general idea I would use.

Upvotes: 2

Related Questions