data = ["something", "something else", "blah", "a string"] result = [(x, len(x)) for x in sorted(data, key = len)] Basically, its more straightforward to sort first then decorate. Although, I'm not sure why you would need the length of the list in your tuple. If you don't really need it sorting by length can be much shorter. **EDIT:** If all I wanted was to output the data, I'd do it like this: for string in sorted(data, key = len): print string, len(string) If you really wanted to eliminate the two references to len you could do: mykey = len for string in sorted(data, key = mykey): print string, mykey(string) But unless you are reusing the code with different mykey's that doesn't seem worthwhile.