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?
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.
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)]
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)]
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.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With