How do I sort a list of dictionaries by a value of the dictionary?

后端 未结 18 2793
半阙折子戏
半阙折子戏 2020-11-21 04:06

I have a list of dictionaries and want each item to be sorted by a specific value.

Take into consideration the list:

[{\'name\':\'Homer\', \'age\':39},         


        
18条回答
  •  天涯浪人
    2020-11-21 04:53

    If performance is a concern, I would use operator.itemgetter instead of lambda as built-in functions perform faster than hand-crafted functions. The itemgetter function seems to perform approximately 20% faster than lambda based on my testing.

    From https://wiki.python.org/moin/PythonSpeed:

    Likewise, the builtin functions run faster than hand-built equivalents. For example, map(operator.add, v1, v2) is faster than map(lambda x,y: x+y, v1, v2).

    Here is a comparison of sorting speed using lambda vs itemgetter.

    import random
    import operator
    
    # Create a list of 100 dicts with random 8-letter names and random ages from 0 to 100.
    l = [{'name': ''.join(random.choices(string.ascii_lowercase, k=8)), 'age': random.randint(0, 100)} for i in range(100)]
    
    # Test the performance with a lambda function sorting on name
    %timeit sorted(l, key=lambda x: x['name'])
    13 µs ± 388 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)
    
    # Test the performance with itemgetter sorting on name
    %timeit sorted(l, key=operator.itemgetter('name'))
    10.7 µs ± 38.1 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)
    
    # Check that each technique produces the same sort order
    sorted(l, key=lambda x: x['name']) == sorted(l, key=operator.itemgetter('name'))
    True
    

    Both techniques sort the list in the same order (verified by execution of the final statement in the code block), but the first one is a little faster.

提交回复
热议问题