0

How do I get tuples from nested list of tuples? Here is what I tried:

from itertools import chain
l = [[[('key1', b'val1', b'val1.2'),[('key2', b'val2'),('key3', b'val3'),('key4', b'val4')]]]]
l2 = list(chain.from_iterable(l)) # tried
print(l2)

[[('key1', b'val1', b'val1.2'), [('key2', b'val2'), ('key3', b'val3'), ('key4', b'val4')]]]

Need output like this one:

[('key1', b'val1', b'val1.2'),('key2', b'val2'),('key3', b'val3'),('key4', b'val4')]
glibdud
  • 7,550
  • 4
  • 27
  • 37
sharp
  • 2,140
  • 9
  • 43
  • 80

1 Answers1

0

Try this recursive generator:

l = [[[('key1', b'val1', b'val1.2'),[('key2', b'val2'),('key3', b'val3'),('key4', b'val4')]]]]

def all_tuples(nested):
    for item in nested:
        if isinstance(item, list):
            yield from all_tuples(item)
        else:
            assert isinstance(item, tuple)
            yield item

print(list(all_tuples(l)))
# [('key1', b'val1', b'val1.2'), ('key2', b'val2'), ('key3', b'val3'), ('key4', b'val4')]
Dennis
  • 2,249
  • 6
  • 12
  • Thanks. What does yeild from do? – sharp May 06 '19 at 20:48
  • You can think of `yield from a()` as meaning `for x in a(): yield x`. There are some nuances, like how it handles exceptions and `send` statements for coroutines, but that is really all that it means in this case. – Dennis May 07 '19 at 00:23