orderby

Python key functions for multi-field ordering


Keywords
sort, order, orderby, development
License
Apache-2.0
Install
pip install orderby==0.0.2

Documentation

orderby

Python key functions for multi-field ordering in SQL ORDER BY fashion

Meant to be used with built-in sorted() key function.

Supports also list.sort() doing in-place sorting.

Implementation uses operator.itemgetter() + some internal helper classes to allow descending sorting order.

So far this is tested and used on lists of dictionaries. Adding support for named tuples and others would be possible (using operator.attrgetter()).

Usage

  • SQL-like: orderby('foo ASC, bar DESC')
  • chained: asc('foo').desc('bar') usage
  • multiple fields at once: asc('foo', 'bar')

Examples

orderby() string syntax:

>>> from orderby import orderby
>>> import json
>>> files = [
...   {'size': 1234, 'path': 'foo/bar.txt'},
...   {'size': 0, 'path': '/dev/null'},
...   {'size': 1234, 'path': 'foo/abc.bin'},
... ]
>>> print(json.dumps(sorted(files, key=orderby('size DESC, path')), indent=2))
[
  {
    "size": 1234,
    "path": "foo/abc.bin"
  },
  {
    "size": 1234,
    "path": "foo/bar.txt"
  },
  {
    "size": 0,
    "path": "/dev/null"
  }
]

Chained asc() and desc() usage:

>>> from orderby import asc, desc
>>> print(json.dumps(sorted(files, key=desc('size').asc('path')), indent=2))
[
  {
    "size": 1234,
    "path": "foo/abc.bin"
  },
  {
    "size": 1234,
    "path": "foo/bar.txt"
  },
  {
    "size": 0,
    "path": "/dev/null"
  }
]

In-place sorting of a list:

>>> files.sort(key=desc('path'))
>>> print(json.dumps(files, indent=2))
[
  {
    "size": 1234,
    "path": "foo/bar.txt"
  },
  {
    "size": 1234,
    "path": "foo/abc.bin"
  },
  {
    "size": 0,
    "path": "/dev/null"
  }
]
>>> files.sort(key=desc('size').asc('path'))
>>> print(json.dumps(files, indent=2))
[
  {
    "size": 1234,
    "path": "foo/abc.bin"
  },
  {
    "size": 1234,
    "path": "foo/bar.txt"
  },
  {
    "size": 0,
    "path": "/dev/null"
  }
]

Internals

To be explained here later...