A Recursive Tree

For the comma in ("Yonkers",) see the comma operator.

"""
The first item in each tuple is a string.
The remaining items, if any, are tuples.
"""

import sys

tree = \
("United States",
    ("New York",
        ("Westchester",
            ("Yonkers",),
            ("Hastings",),
            ("Dobbs Ferry",)
        ),
        ("Putnam",
            ("Garrison",),
            ("Cold Spring",)
        ),
        ("Dutchess",
            ("Poughkeepsie",)
        )
    ),
    ("New Jersey",
        ("Bergen",),
        ("Hudson",),
        ("Essex",)
    ),
    ("Connecticut",)
)

def printTree(t, level = 0):
    "Print the tree whose root is t.  Indent the tree by 4 * level spaces."
    assert type(t) == tuple and len(t) >= 1 and type(t[0]) == str \
        and type(level) == int and level >= 0
    print(f'{4 * level * " "}{t[0]}')
    for child in t[1:]:
        printTree(child, level + 1)

def find(name, t):
    "Return the tuple with the given name, or None if not found"
    assert type(name) == str \
        and type(t) == tuple and len(t) >= 1 and type(t[0]) == str
    if name == t[0]:
        return t
    for child in t[1:]:
        r = find(name, child)
        if r:
            return r
    return None

b = bool(find("Putnam", tree))
print("Could we find Putnam?", b)
print()
printTree(tree)
sys.exit(0)
Could we find Putnam? True

United States
    New York
        Westchester
            Yonkers
            Hastings
            Dobbs Ferry
        Putnam
            Garrison
            Cold Spring
        Dutchess
            Poughkeepsie
    New Jersey
        Bergen
        Hudson
        Essex
    Connecticut