124

I have a list of tuples that look something like this:

("Person 1",10) ("Person 2",8) ("Person 3",12) ("Person 4",20) 

What I want produced, is the list sorted in ascending order, by the second value of the tuple. So L[0] should be ("Person 2", 8) after sorting.

How can I do this? Using Python 3.2.2 If that helps.

0

3 Answers 3

234

You can use the key parameter to list.sort():

my_list.sort(key=lambda x: x[1]) 

or, slightly faster,

my_list.sort(key=operator.itemgetter(1)) 

(As with any module, you'll need to import operator to be able to use it.)

Sign up to request clarification or add additional context in comments.

5 Comments

I've tried using L.sort(key=operator.itemgetter(1)) in my code, but I get a NameError, that 'operator' is not defined. Do I need to import anything special?
Did a bit of a search, need to use import operator to use the function. If you add that to your answer I'll mark it accepted.
Testing with timeit.timeit (default options) there's not a huge difference between these two approaches: operator.itemgetter = 1.05µs, lambda = 1.25µs per iteration
Thanks for the my_list.sort(key=operator.itemgetter(1)) solution!! :)
If you're new to the lambda keyword: stackoverflow.com/questions/13669252/what-is-key-lambda
17

You may also apply the sorted function on your list, which returns a new sorted list. This is just an addition to the answer that Sven Marnach has given above.

# using *sort method* mylist.sort(key=lambda x: x[1]) # using *sorted function* l = sorted(mylist, key=lambda x: x[1]) 

4 Comments

This is just the built-in that returns a new list. Your answer doesn't contribute anything to the ones already here, as it is clear that if you wanted a new list you would use sorted instead of list.sort.
@SamuelNde I scrolled down here because I wasn't sure if the expression worked the same for sorted so it helped me.
Yeah agreed, this helped me too
It actually does contribute, you can use sorted on sets but myset.sort results in an error. So it appears to be the more general answer.
-1
 def findMaxSales(listoftuples): newlist = [] tuple = () for item in listoftuples: movie = item[0] value = (item[1]) tuple = value, movie newlist += [tuple] newlist.sort() highest = newlist[-1] result = highest[1] return result movieList = [("Finding Dory", 486), ("Captain America: Civil War", 408), ("Deadpool", 363), ("Zootopia", 341), ("Rogue One", 529), ("The Secret Life of Pets", 368), ("Batman v Superman", 330), ("Sing", 268), ("Suicide Squad", 325), ("The Jungle Book", 364)] print(findMaxSales(movieList)) 

output --> Rogue One

5 Comments

A couple of thoughts: This doesn't actually answer the question (how to get a list sorted by a value in the tuple); You could unpack the tuple directly in your loop (for movie, value in listoftuples: ); you've overridden the type 'tuple'; And it can actually be done is a single list comprehension: (return sorted((value, movie) for movie, value in listoftuples)[-1][1])
I appreciate what you're going for, but I would argue that it lacks elegance and could be improved. Generally it would be considered poor practice to transform the order of elements in a tupple like this. I think the points about list comprehension and unpacking tupples would still stand. And I would discourage anyone using this methodology over the accepted answer.
I am incapable and could not get the code you posted to work, most likely a user error
but changed it a bit and no doubt your answer is 200x better.
def findMaxSales(listoftuples): newlist = sorted((value,movies) for movies, value in listoftuples) return newlist[-1][1] movieList = [("Finding Dory", 486), ("Captain America: Civil War", 408), ("Deadpool", 363), ("Zootopia", 341), ("Rogue One", 529),("The Secret Life of Pets", 368), ("Batman v Superman", 330), ("Sing", 268), ("Suicide Squad", 325), ("The Jungle Book", 364)] print(findMaxSales(movieList))

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.