Traversing leaf nodes

.py

Get ‘leaves’ traversing multilevel structure of dicts and iterables (yield from expr inspiration/demo)

# { 1: 11,
#   2: [21, 22, 23],
#   3: {31: ['a', 'b', 'c']}
#   } ->  11, 21, 22, 23, 'a', 'b', 'c'

def into(x):
    """ Travesal through hierarchical structures, returning 'leaves' """
    if isinstance(x, dict):
        for v in x.values():
            yield from into(v)
    elif isinstance(x, (tuple, list)):
        for v in x:
            yield from into(v)
    else:
        yield x
# pre-3.3 variation for _counting_ leaves
# (since 'yield from <expr>' appears in Python 3.3)

def into(x, count=0):
    """ 
    Count leaves traversing multilevel structure of dicts and iterables
    All the simple typed values and only nonempty containers are counted
    """
    if isinstance(x, dict):
        return count + sum(into(v, count) for v in x.values())
    elif isinstance(x, (tuple, list)):
        return count + sum(into(v, count) for v in x)
    else:
        return count + 1