I considered a couple methods:
import itertools
COLORED_THINGS = {'blue': ['sky', 'jeans', 'powerline insert mode'],
                  'yellow': ['sun', 'banana', 'phone book/monitor stand'],
                  'red': ['blood', 'tomato', 'test failure']}
def forloops():
    """ Nested for loops. """
    for color, things in COLORED_THINGS.items():
        for thing in things:
            pass
def iterator():
    """ Use itertools and list comprehension to construct iterator. """
    for color, thing in (
        itertools.chain.from_iterable(
            [itertools.product((k,), v) for k, v in COLORED_THINGS.items()])):
        pass
def iterator_gen():
    """ Use itertools and generator to construct iterator. """
    for color, thing in (
        itertools.chain.from_iterable(
            (itertools.product((k,), v) for k, v in COLORED_THINGS.items()))):
        pass
I used ipython and memory_profiler to test performance:
>>> %timeit forloops()
1000000 loops, best of 3: 1.31 µs per loop
>>> %timeit iterator()
100000 loops, best of 3: 3.58 µs per loop
>>> %timeit iterator_gen()
100000 loops, best of 3: 3.91 µs per loop
>>> %memit -r 1000 forloops()
peak memory: 35.79 MiB, increment: 0.02 MiB
>>> %memit -r 1000 iterator()
peak memory: 35.79 MiB, increment: 0.00 MiB
>>> %memit -r 1000 iterator_gen()
peak memory: 35.79 MiB, increment: 0.00 MiB
As you can see, the method had no observable impact on peak memory usage, but nested for loops were unbeatable for speed (not to mention readability).