Skip to content

Instantly share code, notes, and snippets.

@secnot
Last active April 29, 2018 23:16
Show Gist options
  • Save secnot/7f589b01095129b623354cbad932f097 to your computer and use it in GitHub Desktop.
Save secnot/7f589b01095129b623354cbad932f097 to your computer and use it in GitHub Desktop.
Sort object list by one or multiple attributes in normal or reverse order in python3
from operator import attrgetter
def sort_by_attr(alist, *args):
"""
Sort an object list by one or more of its atributes
Parameters:
alist (list): object list
*args (strings): the name of one or more of the objects attributes
possibly preceded by a '-' sign to use reversed order
Example:
sort_by(user_list, "name", "-age")
"""
for fname in reversed(args):
# Remove order modifier from field name
reverse = (fname[0] == '-')
fname = fname[1:] if fname[0] in ("+", "-") else fname
# Sort by field name in selected order
alist.sort(key=attrgetter(fname), reverse=reverse)
# An example
#############
class User(object):
def __init__(self, name, age):
self.name = name
self.age = age
def __repr__(self):
return "<User {} {}>".format(self.name, self.age)
users = [User('john', 44), User('lisa', 22), User('anna', 22), User('peter', 77)]
sort_by_attr(users, "name")
print("name:\t", users)
sort_by_attr(users, "-name")
print("-name:\t", users)
sort_by_attr(users, "age")
print("age:\t", users)
sort_by_attr(users, "-age")
print("-age:\t", users)
sort_by_attr(users, "name", "age")
print("name age:\t", users)
sort_by_attr(users, "age", "name")
print("age name:\t", users)
sort_by_attr(users, "age", "-name")
print("age -name:\t", users)
sort_by_attr(users, "-age", "name")
print("-age name:\t", users)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment