Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

sorting tuples in python with a custom key

Hi: I'm trying to sort a list of tuples in a custom way:
For example:

lt = [(2,4), (4,5), (5,2)]

must be sorted:

lt = [(5,2), (2,4), (4,5)]

Rules:
* b tuple is greater than a tuple if a[1] == b[0]
* a tuple is greater than b tuple if a[0] == b[1]

I've implemented a cmp function like this:

def tcmp(a, b):
    if a[1] == b[0]:
       return -1
    elif a[0] == b[1]:
       return 1
    else:
       return 0

but sorting the list:

lt.sort(tcmp)

lt show me:

lt = [(2, 4), (4, 5), (5, 2)]

What am I doing wrong?

like image 842
Antonio Beamud Avatar asked Dec 29 '10 12:12

Antonio Beamud


4 Answers

Sounds a lot to me you are trying to solve one of the Google's Python class problems, which is to sort a list of tuples in increasing order based on their last element.

This how I did it:

def sort_last(tuples):

  def last_value_tuple(t):
    return t[-1]

  return sorted(tuples, key=last_value_tuple)

EDIT: I didn't read the whole thing, and I assumed it was based on the last element of the tuple. Well, still I'm going to leave it here because it can be useful to anyone.

like image 97
meteorfox Avatar answered Oct 17 '22 05:10

meteorfox


You could also write your code using lambda

def sort(tuples):
  return sorted (tuples,key=lambda last : last[-1])

so sort([(1, 3), (3, 2), (2, 1)]) would yield [(2, 1), (3, 2), (1, 3)]

like image 33
Splash Avatar answered Oct 17 '22 07:10

Splash


You can write your own custom key function to specify the key value for sorting.

Ex.

def sort_last(tuples):

    return sorted(tuples, key=last)

def last(a):
    return a[-1]

tuples => sorted tuple by last element

  • [(1, 3), (3, 2), (2, 1)] => [(2, 1), (3, 2), (1, 3)]
  • [(1, 7), (1, 3), (3, 4, 5), (2, 2)] => [(2, 2), (1, 3), (3, 4, 5), (1, 7)]
like image 4
Rohit Pande Avatar answered Oct 17 '22 05:10

Rohit Pande


I'm not sure your comparison function is a valid one in a mathematical sense, i.e. transitive. Given a, b, c a comparison function saying that a > b and b > c implies that a > c. Sorting procedures rely on this property.

Not to mention that by your rules, for a = [1, 2] and b = [2, 1] you have both a[1] == b[0] and a[0] == b[1] which means that a is both greater and smaller than b.

like image 2
Eli Bendersky Avatar answered Oct 17 '22 05:10

Eli Bendersky