Paddy wrote: > On Apr 9, 4:04 am, Jason <[EMAIL PROTECTED]> wrote: >> Hi folks-- >> >> Basically, I have a pressing need for a combination of 5.2 "Sorting a >> List of Strings Case-Insensitively" & 5.3 "Sorting a List of Objects >> by an Attribute of the Objects" from the Python Cookbook. >> >> My first guess isn't working: >> >> import operator >> def sort_by_attr(seq, attr): >> key=operator.attrgetter(attr) >> key=str.lower >> return sorted(seq, key) >> >> ...would much appreciate any guidance! > > HiJason, > Try key= lambda x: x.attr.lower() > The above should calculate the key only once for the items to be > sorted rather than using cmp which calculates more than that.
A key func is indeed preferable over cmp. Here is a working example: >>> import operator >>> class A(object): ... def __init__(self, name, value): ... self.name = name ... self.value = value ... def __repr__(self): ... return "%s|%s" % (self.name, self.value) ... >>> items = [A("a", "z"), A("C", "Y"), A("b", "x")] >>> items [a|z, C|Y, b|x] >>> def sorted_by_attr_icase(items, attrname): ... get = operator.attrgetter(attrname) ... return sorted(items, key=lambda item: get(item).lower()) ... >>> sorted_by_attr_icase(items, "name") [a|z, b|x, C|Y] >>> sorted_by_attr_icase(items, "value") [b|x, C|Y, a|z] Peter -- http://mail.python.org/mailman/listinfo/python-list