How to sort a list of tuples by their first element?

30,346

Solution 1

You can use the key parameter of the sort function, to sort the tuples. The function of key parameter, is to come up with a value which has to be used to compare two objects. So, in your case, if you want the sort to use only the first element in the tuple, you can do something like this

self.gridKeys.sort(key=lambda x: x[0])

If you want to use only the second element in the tuple, then

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

sort function will pass each and every element in the list to the lambda function you pass as parameter to key and it will use the value it returns, to compare two objects in the list. So, in your case, lets say you have two items in the list like this

data = [(1, 3), (1, 2)]

and if you want to sort by the second element, then you would do

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

First it passes (1, 3) to the lambda function which returns the element at index 1, which is 3 and that will represent this tuple during the comparison. The same way, 2 will be used for the second tuple.

Solution 2

This should do the trick

import operator
self.gridKeys.sort(key=operator.itemgetter(1))

Solution 3

While thefourtheye's solution is correct in the strict sense that it is exactly what you asked for in the title. It may not be actually what you want. It may be better to take it a bit farther via sorting by the reverse of the tuple instead.

self.gridKeys.sort(key=lambda x:tuple(reversed(x)))

This forces you to have an ordering like:

[(0, 0), (1, 0), (2, 0), (3, 0), (4, 0), ...]

Rather than having the first element be unordered like:

[(4, 0), (9, 0), (6, 0), (1, 0), (3, 0), ...]

Which is what I get when using:

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

By default Python does a lexicographical sort from left to right. Reversing the tuple effectively makes Python do the lexicographical sort from right to left.

Share:
30,346
Ericson Willians
Author by

Ericson Willians

Updated on July 17, 2022

Comments

  • Ericson Willians
    Ericson Willians almost 2 years

    I have a list of tuples:

    self.gridKeys = self.gridMap.keys() # The keys of the instance of the GridMap (It returns the product of every possible combination of positions in the specified grid, in tuples.)
    print self.gridKeys
    

    self.gridKeys:

    [(7, 3), (6, 9), (0, 7), (1, 6), (3, 7), (2, 5), (8, 5), (5, 8), (4, 0), (9, 0), (6, 7), (5, 5), (7, 6), (0, 4), (1, 1), (3, 2), (2, 6), (8, 2), (4, 5), (9, 3), (6, 0), (7, 5), (0, 1), (3, 1), (9, 9), (7, 8), (2, 1), (8, 9), (9, 4), (5, 1), (7, 2), (1, 5), (3, 6), (2, 2), (8, 6), (4, 1), (9, 7), (6, 4), (5, 4), (7, 1), (0, 5), (1, 0), (0, 8), (3, 5), (2, 7), (8, 3), (4, 6), (9, 2), (6, 1), (5, 7), (7, 4), (0, 2), (1, 3), (4, 8), (3, 0), (2, 8), (9, 8), (8, 0), (6, 2), (5, 0), (1, 4), (3, 9), (2, 3), (1, 9), (8, 7), (4, 2), (9, 6), (6, 5), (5, 3), (7, 0), (6, 8), (0, 6), (1, 7), (0, 9), (3, 4), (2, 4), (8, 4), (5, 9), (4, 7), (9, 1), (6, 6), (5, 6), (7, 7), (0, 3), (1, 2), (4, 9), (3, 3), (2, 9), (8, 1), (4, 4), (6, 3), (0, 0), (7, 9), (3, 8), (2, 0), (1, 8), (8, 8), (4, 3), (9, 5), (5, 2)]
    

    After sorting:

    self.gridKeys = self.gridMap.keys() # The keys of the instance of the GridMap (It returns the product of every possible combination of positions in the specified grid, in tuples.)
    self.gridKeys.sort() # They're dicts, so they need to be properly ordered for further XML-analysis.
    print self.gridKeys
    

    self.gridKeys:

    [(0, 0), (0, 1), (0, 2), (0, 3), (0, 4), (0, 5), (0, 6), (0, 7), (0, 8), (0, 9), (1, 0), (1, 1), (1, 2), (1, 3), (1, 4), (1, 5), (1, 6), (1, 7), (1, 8), (1, 9), (2, 0), (2, 1), (2, 2), (2, 3), (2, 4), (2, 5), (2, 6), (2, 7), (2, 8), (2, 9), (3, 0), (3, 1), (3, 2), (3, 3), (3, 4), (3, 5), (3, 6), (3, 7), (3, 8), (3, 9), (4, 0), (4, 1), (4, 2), (4, 3), (4, 4), (4, 5), (4, 6), (4, 7), (4, 8), (4, 9), (5, 0), (5, 1), (5, 2), (5, 3), (5, 4), (5, 5), (5, 6), (5, 7), (5, 8), (5, 9), (6, 0), (6, 1), (6, 2), (6, 3), (6, 4), (6, 5), (6, 6), (6, 7), (6, 8), (6, 9), (7, 0), (7, 1), (7, 2), (7, 3), (7, 4), (7, 5), (7, 6), (7, 7), (7, 8), (7, 9), (8, 0), (8, 1), (8, 2), (8, 3), (8, 4), (8, 5), (8, 6), (8, 7), (8, 8), (8, 9), (9, 0), (9, 1), (9, 2), (9, 3), (9, 4), (9, 5), (9, 6), (9, 7), (9, 8), (9, 9)]
    

    The first element of each tuple is the "x", and the second the "y". I'm moving objects in a list through iteration and using these keys (So, if I want to move something in the x axis, I have to go through all the column, and that might be causing a horrid problem that I'm not being able to solve).

    How can I sort the tuples in this way?:

    [(1, 0), (2, 0), (3, 0), (4, 0), (5, 0), ...]
    
    • David Robinson
      David Robinson about 10 years
      But that's not sorting them by their first element, that's sorting by their second element, then their first. Is that what you meant?
    • inspectorG4dget
      inspectorG4dget about 10 years
      I think OP meant first element to be element at index 1
    • Ericson Willians
      Ericson Willians about 10 years
      I meant the first index of each tuple (Now I got a bit confused, but the final list down there is the "sorting" that I want to achieve).
    • David Robinson
      David Robinson about 10 years
      self.gridKeys.sort(key=lambda x: x[1])
  • Ericson Willians
    Ericson Willians about 10 years
    I found that his answer was not exactly what I wanted, but I've figured it out how to use it.. Using both [0] and [1]. self.gridKeys.sort(key=lambda x: x[0]) self.gridKeys.sort(key=lambda x: x[1]) I'll analyze your version of it, thank you :).
  • Ericson Willians
    Ericson Willians about 10 years
    I've found your version more elegant than using both [0] and [1], and I'm using it :).