Sorting email addresses by domain

Mike Meyer mwm at
Thu Nov 11 21:36:04 CET 2004

"EP" <EP at> writes:

> From: Greg Krohn @ invalid wrote:
>> Elegant or Perlish, you decide:
>> addresses.sort(lambda a, b: cmp(a[a.find('@'):].lower(),
>>                                  b[b.find('@'):].lower()))
>> Note that this isn't case sensitive and items without an '@' will be 
>> placed at the end.
> I think: yes and yes.  Looks efficient versus what came to mind for me:
>>>> def sortByDomain(addies=[]):
> 	domains=[a.split("@")[1] for a in addies]
> 	aPairs=zip(domains,addies)
> 	aPairs.sort()
> 	sortedAddies=[tup[1] for tup in aPairs]
> 	return sortedAddies

I wouldn't bet on the one using an internal cmp being faster than
doing the decorate-sort-undecorate version. In fact, my tests on a
list of 16000 addresses show them to be virtually identical. Tuning
your version to get rid of one trip through the list doesn't make much

def sort_by_domain(addies):
    l = [(a.split("@")[1], a) for a in addies]
    return [a[1] for a in l]


Mike Meyer <mwm at>
Independent WWW/Perforce/FreeBSD/Unix consultant, email for more information.

More information about the Python-list mailing list