cpburnz

Python sort list of dicts by list

Jul 3rd, 2012
119
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 1.63 KB | None | 0 0
  1. # Test data.
  2. >>> import shuffle
  3. >>> dicts = [{'id': i} for i in xrange(100)]
  4. >>> dicts
  5. [{'id': 0}, {'id': 1}, ..., {'id': 99}]
  6. >>> order = list(xrange(100))
  7. >>> random.shuffle(order)
  8. >>> order
  9. [54, 35, 21, 55, 5, 63, 1, 39, 41, 13, 77, 31, 62, 10, 14, 30, 15, 75, 85, 20, 59, 90, 86, 28, 80, 95, 51, 87, 69, 6, 11, 8, 19, 34, 25, 24, 12, 33, 94, 3, 50, 70, 82, 38, 76, 32, 89, 64, 17, 9, 57, 97, 16, 44, 27, 60, 43, 48, 45, 26, 91, 72, 93, 29, 61, 4, 68, 42, 74, 73, 88, 7, 84, 96, 98, 2, 46, 47, 52, 67, 79, 22, 40, 65, 36, 99, 56, 81, 92, 18, 0, 58, 49, 78, 23, 66, 53, 37, 71, 83]
  10.  
  11. # Method 1.
  12. def sort_dicts1(dicts, order):
  13.     return sorted(dicts, cmp=lambda x,y: order.index(x['id']) - order.index(y['id']))
  14.  
  15. # Test 1.
  16. >>> import timeit
  17. >>> timeit.repeat('sort_dicts1(dicts, order)', 'from __main__ import dicts, order, sort_dicts1', number=10000)
  18. [10.595271110534668, 10.771971940994263, 10.737603902816772]
  19.  
  20. # Method 2.
  21. def sort_dicts2(dicts, order):
  22.     lookup = {oid: pos for pos, oid in enumerate(order)}
  23.     return sorted(dicts, cmp=lambda x,y: lookup[x['id']] - lookup[y['id']])
  24.  
  25. # Test 2.
  26. >>> import timeit
  27. >>> timeit.repeat('sort_dicts2(dicts, order)', 'from __main__ import dicts, order, sort_dicts2', number=10000)
  28. [1.6150760650634766, 1.598435878753662, 1.5800678730010986]
  29.  
  30. # Method 3.
  31. def sort_dicts3(dicts, order):
  32.     lookup = {oid: pos for pos, oid in enumerate(order)}
  33.     return sorted(dicts, key=lambda x: lookup[x['id']])
  34.  
  35. # Test 3.
  36. >>> import timeit
  37. >>> timeit.repeat('sort_dicts3(dicts, order)', 'from __main__ import dicts, order, sort_dicts3', number=10000)
  38. [0.4634428024291992, 0.44823789596557617, 0.44728708267211914]
Advertisement
Add Comment
Please, Sign In to add comment