<div dir="ltr"># -*- coding: utf-8 -*-<br>"""<br>Created on Tue Apr 12 14:38:28 2016<br><br>@author: Kirby Urner, 4Dsolutions.net<br><br>Tips and Tricks:<br>Note use of **self.__dict__ in the __repr__, and print(*sorted(L)).<br>Also, remember sep= and end= are overridable keyword args to print().<br><br>Related: data-only objects<br><a href="http://stackoverflow.com/questions/19988043/are-data-only-objects-ok-in-an-oop-design">http://stackoverflow.com/questions/19988043/are-data-only-objects-ok-in-an-oop-design</a><br><br>See also:<br><br>Data Transfer Object, Passive Data Object, Bunch Class<br>E.g.: <a href="http://pydanny.blogspot.com/2011/11/loving-bunch-class.html">http://pydanny.blogspot.com/2011/11/loving-bunch-class.html</a><br><br><br>"""<br>from collections import namedtuple<br><br># first, with an ordinary class (not quite a 'Bunch class', but could be)<br>class Element:<br>    <br>    def __init__(self, dim0, dim1, dim2, dim3):<br>        self.axis0 = dim0<br>        self.axis1 = dim1<br>        self.axis2 = dim2<br>        self.axis3 = dim3<br><br>    def __repr__(self):<br>        return 'Element({axis0},{axis1},{axis2},{axis3})'.\<br>                format(**self.__dict__)<br><br>the_list = [Element('A', 'D', 0, 1),   # goal:  to sort on different axes<br>            Element('X', 'R', 2, 3), <br>            Element('R', 'B', 9, 8)]<br><br># sort on any attribute of Element<br>print(sorted(the_list, key=lambda elem: elem.axis0))  # lambda extracts the key<br>print(sorted(the_list, key=lambda elem: elem.axis1))<br>print(sorted(the_list, key=lambda elem: elem.axis2))<br>print(sorted(the_list, key=lambda elem: elem.axis3))<br><br><br># one might use a named tuple to the same end<br>Elem = namedtuple("Elem", "axis0 axis1 axis2, axis3")<br><br>the_list = [Elem('A', 'D', 0, 1), <br>            Elem('X', 'R', 2, 3), <br>            Elem('R', 'B', 9, 8)]<br><br># almost identical syntax but line-wrapping added because namedtuple __repr__<br># is more verbose...<br>print("+++")<br>print(*sorted(the_list, key=lambda elem: elem.axis0), sep="\n", end="\n--\n")<br>print(*sorted(the_list, key=lambda elem: elem.axis1), sep="\n", end="\n--\n")<br>print(*sorted(the_list, key=lambda elem: elem.axis2), sep="\n", end="\n--\n")<br>print(*sorted(the_list, key=lambda elem: elem.axis3), sep="\n", end="\n--\n")<br>    <br>expected_output = \<br>"""<br>OUTPUT:<br><br>[Element(A,D,0,1), Element(R,B,9,8), Element(X,R,2,3)]<br>[Element(R,B,9,8), Element(A,D,0,1), Element(X,R,2,3)]<br>[Element(A,D,0,1), Element(X,R,2,3), Element(R,B,9,8)]<br>[Element(A,D,0,1), Element(X,R,2,3), Element(R,B,9,8)]<br>+++<br>Elem(axis0='A', axis1='D', axis2=0, axis3=1)<br>Elem(axis0='R', axis1='B', axis2=9, axis3=8)<br>Elem(axis0='X', axis1='R', axis2=2, axis3=3)<br>--<br>Elem(axis0='R', axis1='B', axis2=9, axis3=8)<br>Elem(axis0='A', axis1='D', axis2=0, axis3=1)<br>Elem(axis0='X', axis1='R', axis2=2, axis3=3)<br>--<br>Elem(axis0='A', axis1='D', axis2=0, axis3=1)<br>Elem(axis0='X', axis1='R', axis2=2, axis3=3)<br>Elem(axis0='R', axis1='B', axis2=9, axis3=8)<br>--<br>Elem(axis0='A', axis1='D', axis2=0, axis3=1)<br>Elem(axis0='X', axis1='R', axis2=2, axis3=3)<br>Elem(axis0='R', axis1='B', axis2=9, axis3=8)<br>"""<br><br></div>