[Tutor] List sorting issues

Steven D'Aprano steve at pearwood.info
Tue Mar 29 00:28:11 CEST 2011

Eric Stevens wrote:
> I am currently designing an address book program, and am trying to design a
> method for organizing the keys (which are the names of the entries) for
> displaying purposes. I have created a list by doing sortedKeys =
> self.addbook.keys() {the self.addbook refers to a dictionary in a custom
> class}, and then i try to do a sortedKeys.sort() but never get an
> alphabetical list of the keys. All i get is 'None'. I know that a
> 'list.sort()' returns a None value but all of the tutorials I see show this
> giving an alphabetized list.

If you see any tutorial showing list.sort() *returning* a sorted list, 
the tutorial is wrong. But more likely you have misunderstood what you 
are seeing.

list.sort() is an in-place list. So you have to do this:

mylist = ["Fred", "Wilma", "Barney", "Betty"]
mylist.sort()  # Returns None, which we don't bother to keep.

Or you can use the sorted() function, which returns a new list, leaving 
the original alone:

mylist = ["Fred", "Wilma", "Barney", "Betty"]

>  I have also tried doing a 'sorted(self.addbook)' which gives me a list but
> not alphabetized. The dictionary keys I am using are 'Eric', 'Kyle', and
> 'dfd' and they always appear in that order when i use the sorted() feature
> (obviously not alphabetized).

Sorting is case sensitive, so "Z" comes before "a". For case insensitive 
sorting, pass a key function to either sorted() or list.sort():

sorted(mylist, key=string.lower)  # Can also use string.upper

Technically, this is not really case-insensitive according to the (very 
complex!) rules for sorting international text, but if your data is all 
English (or at least mostly English) you won't notice the difference.


More information about the Tutor mailing list