Sorting a List of Objects by an Attribute of the Objects Case-Insensitively
Peter Otten
__peter__ at web.de
Wed Apr 9 03:31:06 EDT 2008
Paddy wrote:
> On Apr 9, 4:04 am, Jason <elgrandchig... at gmail.com> 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
More information about the Python-list
mailing list