python: iterating through a dictionary with list values

前端 未结 4 2162
时光说笑
时光说笑 2020-12-08 10:18

Given a dictionary of lists, such as

d = {\'1\':[11,12], \'2\':[21,21]}

Which is more pythonic or otherwise preferable:

fo         


        
4条回答
  •  孤街浪徒
    2020-12-08 10:25

    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).

提交回复
热议问题